一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

云服務器|WEB服務器|FTP服務器|郵件服務器|虛擬主機|服務器安全|DNS服務器|服務器知識|Nginx|IIS|Tomcat|

服務器之家 - 服務器技術 - Nginx - 詳解nginx basic auth配置踩坑記

詳解nginx basic auth配置踩坑記

2019-12-24 13:39搬瓦工 Nginx

本篇文章主要介紹了詳解nginx basic auth配置踩坑記,nginx的basic auth配置由ngx_http_auth_basic_module模塊提供,對HTTP Basic Authentication協議進行了支持,感興趣的小伙伴們可以參考一下

nginx的basic auth配置由ngx_http_auth_basic_module模塊提供,對HTTP Basic Authentication協議進行了支持,用戶可通過該配置設置用戶名和密碼對web站點進行簡單的訪問控制。

basic auth配置示例:

?
1
2
3
4
location / {
  auth_basic      "closed site";
  auth_basic_user_file conf/htpasswd;
}

說明:

  1. auth_basic可設置為off或其它字符串,為off時表示不開啟密碼驗證
  2. auth_basic_user_file 為包含用戶名和密碼的文件,文件內容如elastic:YsEm9Tb4.RwB6

踩坑的地方就是這個密碼,官方文檔里對支持的密碼類型進行了說明:

  1. 采用系統函數crypt()加密的密碼;可通過htpasswd命令或者openssl passwd命令生成
  2. 通過Apache提供的基于MD5的變種加密算法(apr1),同樣可通過htpasswd或者openssl passwd命令生成
  3. 以“{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支持的密碼

在進行自動生成密碼開發之前,思考了一下大概有三種方案可以實現:

  1. 項目服務器上安裝htpasswd工具或openssl, 通過代碼執行本地命令生成加密密碼
  2. 直接調用Linux系統函數crypt()加密密碼
  3. 使用go標準庫crypto加密密碼

首先,第一種方式是不太可取的,因為需要強依賴服務器環境,所以直接pass。下面看第二種和第三種方式的具體實現。

直接調用系統函數crypt()

Linux的crypt函數有兩個參數,函數定義為:

?
1
char *crypt(const char *key, const char *salt);

其中參數key為需要加密的內容,salt參數有兩種類型:

  1. 長度為2的字符串,取值范圍為[a-zA-Z0-9./],如果超過兩位會被忽略,并且只能支持最長8位的key,如果key超過8位,則8位之后的會被忽略
  2. $id$salt$encrypted 格式,用于支持其它的加密算法, id表示算法類型,具體取值有:
?
1
2
3
4
5
6
7
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函數的具體實現:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package crypt
 
/*
#define _GNU_SOURCE
#include <unistd.h>
*/
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
}

生成密碼的具體實現:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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加密算法進行密碼加密的代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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支持的對密碼加密的字符串。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://segmentfault.com/a/1190000015437833

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 9久热这里只有精品视频在线观看 | brazzers办公室| 国产成人咱精品视频免费网站 | 色婷婷网| 国产a一级毛片爽爽影院 | chinses台湾男同志hd | 波多野结衣52部合集在线观看 | bt7086新片速递亚洲最新合集 | 国产二区三区 | 韩国理论片最新第一页 | xx18-19xxxxhd| 亚洲品质水蜜桃 | 闺蜜的样子小说安沁在线阅读 | 国产精品视频第一页 | 国产青草视频在线观看免费影院 | 视频久久精品 | 国产国语videosex另类 | 99视频在线免费观看 | 手机能看的黄色网站 | 亚洲国产精品久久久久久网站 | 精品国产一区二区 | 不良研究所地址一 | 91在线视频播放 | 亚洲视屏在线观看 | 国产福利专区精品视频 | 日本免费高清在线 | 免费在线观看成年人视频 | haodiaocao的视频这里看 | 双子母性本能在线 | 日本伊人久久 | 国产一区二区视频在线观看 | 亚洲AV无码A片在线观看蜜桃 | 国产黄频在线观看高清免费 | 亚洲成色 | 爽好大快深点一视频 | 午夜一级影院 | 日本videossexx日本人 | 免费精品在线视频 | 成人私人影院www片免费高清 | 手机av影院| 私人影院在线免费观看 |