摘要:的配置由模塊提供,對協議進行了支持,用戶可通過該配置設置用戶名和密碼對站點進行簡單的訪問控制。其中指的是加密算法,支持的有算法。
nginx的basic auth配置由ngx_http_auth_basic_module模塊提供,對HTTP Basic Authentication協議進行了支持,用戶可通過該配置設置用戶名和密碼對web站點進行簡單的訪問控制。
basic auth配置示例:
location / { auth_basic "closed site"; auth_basic_user_file conf/htpasswd; }
說明:
auth_basic可設置為off或其它字符串,為off時表示不開啟密碼驗證
auth_basic_user_file 為包含用戶名和密碼的文件,文件內容如elastic:YsEm9Tb4.RwB6
踩坑的地方就是這個密碼,官方文檔里對支持的密碼類型進行了說明:
采用系統函數crypt()加密的密碼;可通過htpasswd命令或者openssl passwd命令生成
通過Apache提供的基于MD5的變種加密算法(apr1),同樣可通過htpasswd或者openssl passwd命令生成
以“{scheme}data”格式表示的加密后的密碼,RFC
2307中有對該格式的密碼標準進行了說明。其中scheme指的是加密算法,nginx支持的scheme有PLAIN, SHA,
SSHA算法。
使用htpasswd或者openssl passwd命令生成的密碼固然可以使得配置生效,nginx能夠正常地進行密碼安全校驗,如果密碼類型不支持, 則nginx或報錯:
crypt_r() failed (22: Invalid argument)
但是因為業務的需要,我們要用代碼生成nginx的配置并下發配置到每個云主機中,之后拉起nginx進程。項目代碼使用go語言編寫,所以需要找一個對應的函數或者庫生成nginx支持的密碼。
go語言生成nginx支持的密碼在進行自動生成密碼開發之前,思考了一下大概有三種方案可以實現:
項目服務器上安裝htpasswd工具或openssl, 通過代碼執行本地命令生成加密密碼
直接調用Linux系統函數crypt()加密密碼
使用go標準庫crypto加密密碼
首先,第一種方式是不太可取的,因為需要強依賴服務器環境,所以直接pass。下面看第二種和第三種方式的具體實現。
直接調用系統函數crypt()Linux的crypt函數有兩個參數,函數定義為:
char *crypt(const char *key, const char *salt);
其中參數key為需要加密的內容,salt參數有兩種類型:
長度為2的字符串,取值范圍為[a-zA-Z0-9./],如果超過兩位會被忽略,并且只能支持最長8位的key,如果key超過8位,則8位之后的會被忽略
$id$salt$encrypted 格式,用于支持其它的加密算法, id表示算法類型,具體取值有:
ID | Method ───────────────────────────────────────────── 1 | MD5 2a | Blowfish (not in mainline glibc; added in some | Linux distributions) 5 | SHA-256 (since glibc 2.7) 6 | SHA-512 (since glibc 2.7)
go語言中可以通過import "C"方式直接調用c語言的庫函數,下面是封裝crypt函數的具體實現:
package crypt /* #define _GNU_SOURCE #include*/ import "C" import ( "sync" "unsafe" ) var ( mu sync.Mutex ) func Crypt(pass, salt string) (string, error) { c_pass := C.CString(pass) defer C.free(unsafe.Pointer(c_pass)) c_salt := C.CString(salt) defer C.free(unsafe.Pointer(c_salt)) mu.Lock() c_enc, err := C.crypt(c_pass, c_salt) mu.Unlock() if c_enc == nil { return "", err } defer C.free(unsafe.Pointer(c_enc)) return C.GoString(c_enc), err }
生成密碼的具體實現:
func main() { des, err := crypt.Crypt("Elastic123", "in") if err != nil { fmt.Errorf("error:", err) return } sha512, err := crypt.Crypt("Elastic123", "$6$SomeSaltSomePepper$") if err != nil { fmt.Errorf("error:", err) return } fmt.Println("des:", des) fmt.Println("SHA512:", sha512) }
經過實測,上述通過調用crypt函數生成nginx支持的加密密碼實際可用,但是需要注意的是如果密碼長度超過8位,則salt參數只能選擇$id$salt$encrypted類型,在測試過程中就是因為踩了這點坑導致nginx只能校驗密碼的前8位,無語。
因為在編寫go代碼過程中調用了C函數庫,這種方式也需要依賴服務器所處環境,因此最好的方式是采用go標準庫中的函數對密碼進行加密。
使用crypto函數庫go的crypto標準庫封裝了很多中加密算法,采用SHA加密算法進行密碼加密的代碼如下:
package util import ( "crypto/sha1" "encoding/base64" ) func GetSha(password string) string { s := sha1.New() s.Write([]byte(password)) passwordSum := []byte(s.Sum(nil)) return base64.StdEncoding.EncodeToString(passwordSum) }
測試過程中通過調用GetSha()函數生成了對密碼加密的字符串,但是直接配置在nginx的conf/htpasswd文件中,reload nginx配置后測試驗證密碼是否生效,結果還是報錯,原來如前文所述,SHA加密的密碼必須帶有“{SHA}”前綴才可以,再次修改配置后經過驗證,成功地用代碼生成了nginx支持的對密碼加密的字符串。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40002.html
摘要:有著最全的協議支持,同時有各種非阻塞拓展,可以說是最符合要求的,但是異步需要對做很大的改動。的計劃將基于開發,同時也提供一些無法提供的功能和特性。 一點小遺憾 對于 Notadd 我們本來期望它實現更多... 盡管我們也嘗試做了很多努力,但是由于 PHP 本身的局限,以及考慮到開發環境配置的復雜程度,最終使用了折中方案。接下來,我們談談整個技術選型歷程,也供今后相關開發者做借鑒和參考:...
摘要:前言最近開始研究的應用,于是打算搭建一個私有的倉庫,并使用阿里云的作為存儲引擎。登陸成功后,執行以下命令即可上傳配置阿里云首先在剛才執行的命令行窗口中按退出服務。待上傳完畢,可以打開阿里云的控制臺界面檢查文件是否被正確上傳上去了。 前言 最近開始研究 Docker 的應用,于是打算 搭建一個私有的 Docker 倉庫,并使用阿里云的 OSS 作為存儲引擎 。從網上搜索到的資料大都是比較...
摘要:配置進行基礎用戶驗證使用指令指定設置受保護區域的名稱,此名稱會顯示在賬號密碼彈窗上,使用指令設置帶有賬戶密碼信息的路徑。例如配置此外,如果某個區塊不想繼承整個認證體系,可以在區塊內設置即用戶認證關閉狀態。通過和身份驗證將限制與指令相結合。 原文鏈接: 何曉東 博客 應用場景:大概是在內部網站需要外部用戶訪問到,同時不能給訪問者網站賬號權限,所以在 nginx 層面進行限制。例如外包項目...
最近偶然想學習下webpack的配置,于是走上了webpack4踩坑的不歸路。。。 webpack4默認的特性: 配置默認初始化一些配置, 比如 entry 默認 ./src 開發模式和發布模式, 插件默認內置 CommonsChunk 配置簡化 使用 ES6 語法,比如 Map, Set, includes 新增 WebAssembly 構建支持 如果要使用 webpack cli 命令,...
閱讀 2870·2021-10-14 09:43
閱讀 1657·2021-09-29 09:34
閱讀 1743·2021-07-28 00:16
閱讀 2962·2019-08-30 15:53
閱讀 2905·2019-08-30 13:59
閱讀 2961·2019-08-30 13:57
閱讀 1091·2019-08-26 13:38
閱讀 1893·2019-08-26 13:25