成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

nginx basic auth配置踩坑記

canger / 1947人閱讀

摘要:的配置由模塊提供,對(duì)協(xié)議進(jìn)行了支持,用戶可通過該配置設(shè)置用戶名和密碼對(duì)站點(diǎn)進(jìn)行簡(jiǎn)單的訪問控制。其中指的是加密算法,支持的有算法。

nginx的basic auth配置由ngx_http_auth_basic_module模塊提供,對(duì)HTTP Basic Authentication協(xié)議進(jìn)行了支持,用戶可通過該配置設(shè)置用戶名和密碼對(duì)web站點(diǎn)進(jìn)行簡(jiǎn)單的訪問控制。

basic auth配置示例:

location / {
    auth_basic           "closed site";
    auth_basic_user_file conf/htpasswd;
}

說明:

auth_basic可設(shè)置為off或其它字符串,為off時(shí)表示不開啟密碼驗(yàn)證

auth_basic_user_file 為包含用戶名和密碼的文件,文件內(nèi)容如elastic:YsEm9Tb4.RwB6

踩坑的地方就是這個(gè)密碼,官方文檔里對(duì)支持的密碼類型進(jìn)行了說明:

采用系統(tǒng)函數(shù)crypt()加密的密碼;可通過htpasswd命令或者openssl passwd命令生成

通過Apache提供的基于MD5的變種加密算法(apr1),同樣可通過htpasswd或者openssl passwd命令生成

以“{scheme}data”格式表示的加密后的密碼,RFC
2307中有對(duì)該格式的密碼標(biāo)準(zhǔn)進(jìn)行了說明。其中scheme指的是加密算法,nginx支持的scheme有PLAIN, SHA,
SSHA算法。

使用htpasswd或者openssl passwd命令生成的密碼固然可以使得配置生效,nginx能夠正常地進(jìn)行密碼安全校驗(yàn),如果密碼類型不支持, 則nginx或報(bào)錯(cuò):

crypt_r() failed (22: Invalid argument)

但是因?yàn)闃I(yè)務(wù)的需要,我們要用代碼生成nginx的配置并下發(fā)配置到每個(gè)云主機(jī)中,之后拉起nginx進(jìn)程。項(xiàng)目代碼使用go語(yǔ)言編寫,所以需要找一個(gè)對(duì)應(yīng)的函數(shù)或者庫(kù)生成nginx支持的密碼。

go語(yǔ)言生成nginx支持的密碼

在進(jìn)行自動(dòng)生成密碼開發(fā)之前,思考了一下大概有三種方案可以實(shí)現(xiàn):

項(xiàng)目服務(wù)器上安裝htpasswd工具或openssl, 通過代碼執(zhí)行本地命令生成加密密碼

直接調(diào)用Linux系統(tǒng)函數(shù)crypt()加密密碼

使用go標(biāo)準(zhǔn)庫(kù)crypto加密密碼

首先,第一種方式是不太可取的,因?yàn)樾枰獜?qiáng)依賴服務(wù)器環(huán)境,所以直接pass。下面看第二種和第三種方式的具體實(shí)現(xiàn)。

直接調(diào)用系統(tǒng)函數(shù)crypt()

Linux的crypt函數(shù)有兩個(gè)參數(shù),函數(shù)定義為:

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

其中參數(shù)key為需要加密的內(nèi)容,salt參數(shù)有兩種類型:

長(zhǎng)度為2的字符串,取值范圍為[a-zA-Z0-9./],如果超過兩位會(huì)被忽略,并且只能支持最長(zhǎng)8位的key,如果key超過8位,則8位之后的會(huì)被忽略

$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語(yǔ)言中可以通過import "C"方式直接調(diào)用c語(yǔ)言的庫(kù)函數(shù),下面是封裝crypt函數(shù)的具體實(shí)現(xiàn):

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
}

生成密碼的具體實(shí)現(xiàn):

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)
}

經(jīng)過實(shí)測(cè),上述通過調(diào)用crypt函數(shù)生成nginx支持的加密密碼實(shí)際可用,但是需要注意的是如果密碼長(zhǎng)度超過8位,則salt參數(shù)只能選擇$id$salt$encrypted類型,在測(cè)試過程中就是因?yàn)椴攘诉@點(diǎn)坑導(dǎo)致nginx只能校驗(yàn)密碼的前8位,無語(yǔ)。

因?yàn)樵诰帉慻o代碼過程中調(diào)用了C函數(shù)庫(kù),這種方式也需要依賴服務(wù)器所處環(huán)境,因此最好的方式是采用go標(biāo)準(zhǔn)庫(kù)中的函數(shù)對(duì)密碼進(jìn)行加密。

使用crypto函數(shù)庫(kù)

go的crypto標(biāo)準(zhǔn)庫(kù)封裝了很多中加密算法,采用SHA加密算法進(jìn)行密碼加密的代碼如下:

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)
}

測(cè)試過程中通過調(diào)用GetSha()函數(shù)生成了對(duì)密碼加密的字符串,但是直接配置在nginx的conf/htpasswd文件中,reload nginx配置后測(cè)試驗(yàn)證密碼是否生效,結(jié)果還是報(bào)錯(cuò),原來如前文所述,SHA加密的密碼必須帶有“{SHA}”前綴才可以,再次修改配置后經(jīng)過驗(yàn)證,成功地用代碼生成了nginx支持的對(duì)密碼加密的字符串。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/40002.html

相關(guān)文章

  • Notadd 2.0 全新 Node.js 版本~ (開發(fā)中) [從 PHP 到 node 的坑記

    摘要:有著最全的協(xié)議支持,同時(shí)有各種非阻塞拓展,可以說是最符合要求的,但是異步需要對(duì)做很大的改動(dòng)。的計(jì)劃將基于開發(fā),同時(shí)也提供一些無法提供的功能和特性。 一點(diǎn)小遺憾 對(duì)于 Notadd 我們本來期望它實(shí)現(xiàn)更多... 盡管我們也嘗試做了很多努力,但是由于 PHP 本身的局限,以及考慮到開發(fā)環(huán)境配置的復(fù)雜程度,最終使用了折中方案。接下來,我們談?wù)務(wù)麄€(gè)技術(shù)選型歷程,也供今后相關(guān)開發(fā)者做借鑒和參考:...

    Tonny 評(píng)論0 收藏0
  • 利用阿里云 OSS 搭建私有 Docker 倉(cāng)庫(kù)

    摘要:前言最近開始研究的應(yīng)用,于是打算搭建一個(gè)私有的倉(cāng)庫(kù),并使用阿里云的作為存儲(chǔ)引擎。登陸成功后,執(zhí)行以下命令即可上傳配置阿里云首先在剛才執(zhí)行的命令行窗口中按退出服務(wù)。待上傳完畢,可以打開阿里云的控制臺(tái)界面檢查文件是否被正確上傳上去了。 前言 最近開始研究 Docker 的應(yīng)用,于是打算 搭建一個(gè)私有的 Docker 倉(cāng)庫(kù),并使用阿里云的 OSS 作為存儲(chǔ)引擎 。從網(wǎng)上搜索到的資料大都是比較...

    haoguo 評(píng)論0 收藏0
  • Nginx 層面配置基礎(chǔ)用戶驗(yàn)證

    摘要:配置進(jìn)行基礎(chǔ)用戶驗(yàn)證使用指令指定設(shè)置受保護(hù)區(qū)域的名稱,此名稱會(huì)顯示在賬號(hào)密碼彈窗上,使用指令設(shè)置帶有賬戶密碼信息的路徑。例如配置此外,如果某個(gè)區(qū)塊不想繼承整個(gè)認(rèn)證體系,可以在區(qū)塊內(nèi)設(shè)置即用戶認(rèn)證關(guān)閉狀態(tài)。通過和身份驗(yàn)證將限制與指令相結(jié)合。 原文鏈接: 何曉東 博客 應(yīng)用場(chǎng)景:大概是在內(nèi)部網(wǎng)站需要外部用戶訪問到,同時(shí)不能給訪問者網(wǎng)站賬號(hào)權(quán)限,所以在 nginx 層面進(jìn)行限制。例如外包項(xiàng)目...

    lentrue 評(píng)論0 收藏0
  • webpack4 坑記

    最近偶然想學(xué)習(xí)下webpack的配置,于是走上了webpack4踩坑的不歸路。。。 webpack4默認(rèn)的特性: 配置默認(rèn)初始化一些配置, 比如 entry 默認(rèn) ./src 開發(fā)模式和發(fā)布模式, 插件默認(rèn)內(nèi)置 CommonsChunk 配置簡(jiǎn)化 使用 ES6 語(yǔ)法,比如 Map, Set, includes 新增 WebAssembly 構(gòu)建支持 如果要使用 webpack cli 命令,...

    lookSomeone 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<