欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解nginx basic auth配置踩坑記

 更新時(shí)間:2018年07月02日 09:04:36   作者:搬瓦工  
本篇文章主要介紹了詳解nginx basic auth配置踩坑記,nginx的basic auth配置由ngx_http_auth_basic_module模塊提供,對(duì)HTTP Basic Authentication協(xié)議進(jìn)行了支持,感興趣的小伙伴們可以參考一下

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

basic auth配置示例:

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

說(shuō)明:

  1. auth_basic可設(shè)置為off或其它字符串,為off時(shí)表示不開(kāi)啟密碼驗(yàn)證
  2. auth_basic_user_file 為包含用戶(hù)名和密碼的文件,文件內(nèi)容如elastic:YsEm9Tb4.RwB6

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

  1. 采用系統(tǒng)函數(shù)crypt()加密的密碼;可通過(guò)htpasswd命令或者openssl passwd命令生成
  2. 通過(guò)Apache提供的基于MD5的變種加密算法(apr1),同樣可通過(guò)htpasswd或者openssl passwd命令生成
  3. 以“{scheme}data”格式表示的加密后的密碼,RFC 2307中有對(duì)該格式的密碼標(biāo)準(zhǔn)進(jìn)行了說(shuō)明。其中scheme指的是加密算法,nginx支持的scheme有PLAIN, SHA,SSHA算法。

使用htpasswd或者openssl passwd命令生成的密碼固然可以使得配置生效,nginx能夠正常地進(jìn)行密碼安全校驗(yàn),如果密碼類(lèi)型不支持, 則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ǔ)言編寫(xiě),所以需要找一個(gè)對(duì)應(yīng)的函數(shù)或者庫(kù)生成nginx支持的密碼。

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

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

  1. 項(xiàng)目服務(wù)器上安裝htpasswd工具或openssl, 通過(guò)代碼執(zhí)行本地命令生成加密密碼
  2. 直接調(diào)用Linux系統(tǒng)函數(shù)crypt()加密密碼
  3. 使用go標(biāo)準(zhǔn)庫(kù)crypto加密密碼

首先,第一種方式是不太可取的,因?yàn)樾枰獜?qiáng)依賴(lài)服務(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ù)有兩種類(lèi)型:

  1. 長(zhǎng)度為2的字符串,取值范圍為[a-zA-Z0-9./],如果超過(guò)兩位會(huì)被忽略,并且只能支持最長(zhǎng)8位的key,如果key超過(guò)8位,則8位之后的會(huì)被忽略
  2. $id$salt$encrypted 格式,用于支持其它的加密算法, id表示算法類(lèi)型,具體取值有:
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ǔ)言中可以通過(guò)import "C"方式直接調(diào)用c語(yǔ)言的庫(kù)函數(shù),下面是封裝crypt函數(shù)的具體實(shí)現(xiàn):

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
}

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

因?yàn)樵诰帉?xiě)go代碼過(guò)程中調(diào)用了C函數(shù)庫(kù),這種方式也需要依賴(lài)服務(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è)試過(guò)程中通過(guò)調(diào)用GetSha()函數(shù)生成了對(duì)密碼加密的字符串,但是直接配置在nginx的conf/htpasswd文件中,reload nginx配置后測(cè)試驗(yàn)證密碼是否生效,結(jié)果還是報(bào)錯(cuò),原來(lái)如前文所述,SHA加密的密碼必須帶有“{SHA}”前綴才可以,再次修改配置后經(jīng)過(guò)驗(yàn)證,成功地用代碼生成了nginx支持的對(duì)密碼加密的字符串。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 記一次nginx中proxy_pass的使用問(wèn)題

    記一次nginx中proxy_pass的使用問(wèn)題

    這篇文章主要介紹了記一次nginx中proxy_pass的使用問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • 使用nginx解決前端js下載跨域問(wèn)題

    使用nginx解決前端js下載跨域問(wèn)題

    訂單系統(tǒng)增加附件預(yù)覽,下載的功能,但是這個(gè)附件是客戶(hù)推單時(shí)推送過(guò)來(lái)的,文件連接是類(lèi)似oss連接,但是是客戶(hù)的域名,所以導(dǎo)致跨域問(wèn)題,本文小編將給大家介紹如何用nginx解決前端js下載跨域問(wèn)題,需要的朋友可以參考下
    2023-10-10
  • Linux下安裝nginx的實(shí)現(xiàn)方法

    Linux下安裝nginx的實(shí)現(xiàn)方法

    這篇文章主要介紹了Linux下安裝nginx的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-04-04
  • centos7系統(tǒng)下nginx安裝并配置開(kāi)機(jī)自啟動(dòng)操作

    centos7系統(tǒng)下nginx安裝并配置開(kāi)機(jī)自啟動(dòng)操作

    這篇文章主要介紹了centos7系統(tǒng)下nginx安裝并配置開(kāi)機(jī)自啟動(dòng)操作方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • CentOS 7.3.1611編譯安裝Nginx1.10.3+MySQL5.7.16+PHP7.1.2

    CentOS 7.3.1611編譯安裝Nginx1.10.3+MySQL5.7.16+PHP7.1.2

    這篇文章主要介紹了CentOS 7.3.1611編譯安裝Nginx1.10.3+MySQL5.7.16+PHP7.1.2,需要的朋友可以參考下
    2018-01-01
  • 詳解nginx實(shí)現(xiàn)ssl反向代理實(shí)戰(zhàn)

    詳解nginx實(shí)現(xiàn)ssl反向代理實(shí)戰(zhàn)

    本篇文章主要介紹了nginx實(shí)現(xiàn)ssl反向代理實(shí)戰(zhàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • nginx源碼分析線(xiàn)程池詳解

    nginx源碼分析線(xiàn)程池詳解

    這篇文章主要介紹了nginx源碼分析線(xiàn)程池詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Nginx 搭建域名訪問(wèn)環(huán)境的詳細(xì)過(guò)程

    Nginx 搭建域名訪問(wèn)環(huán)境的詳細(xì)過(guò)程

    這篇文章主要介紹了Nginx 搭建域名訪問(wèn)環(huán)境的詳細(xì)過(guò)程,通過(guò)示例代碼講解了Nginx 搭建轉(zhuǎn)發(fā)網(wǎng)關(guān)進(jìn)行負(fù)載均衡的相關(guān)操作,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • 讓VIM支持Nginx .conf文件語(yǔ)法高亮顯示功能的方法

    讓VIM支持Nginx .conf文件語(yǔ)法高亮顯示功能的方法

    這篇文章主要給大家介紹了關(guān)于讓VIM支持Nginx .conf文件語(yǔ)法高亮顯示功能的方法,文中分別介紹了手動(dòng)修改和自動(dòng)化腳本兩種方法的實(shí)現(xiàn),都給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-07-07
  • Centos7 安裝Nginx整合Lua的示例代碼

    Centos7 安裝Nginx整合Lua的示例代碼

    這篇文章主要介紹了Centos7 安裝Nginx整合Lua的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12

最新評(píng)論