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;}
说明:
踩坑的地方就是这个密码,官方文档里对支持的密码类型进行了说明:
使用htpasswd或者openssl passwd命令生成的密码固然可以使得配置生效,nginx能够正常地进行密码安全校验,如果密码类型不支持, 则nginx或报错:
crypt_r() failed (22: Invalid argument)
但是因为业务的需要,我们要用代码生成nginx的配置并下发配置到每个云主机中,之后拉起nginx进程。项目代码使用go语言编写,所以需要找一个对应的函数或者库生成nginx支持的密码。
go语言生成nginx支持的密码
在进行自动生成密码开发之前,思考了一下大概有三种方案可以实现:
首先,第一种方式是不太可取的,因为需要强依赖服务器环境,所以直接pass。下面看第二种和第三种方式的具体实现。
直接调用系统函数crypt()
Linux的crypt函数有两个参数,函数定义为:
char *crypt(const char *key, const char *salt);
其中参数key为需要加密的内容,salt参数有两种类型:
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函数的具体实现:
新闻热点
疑难解答