缘起:nginx官方没有实现 HTTP digest 摘要认证,经过测试第三方模块 nginx-http-auth-digest 貌似在最新版nginx上不能用了。而受支持的basic验证,密码传输是明文的,很不安全。我的vps上个人的应用越来越多的,现在都是通过basic方式进行的验证,本想用ssl 加密一下,又不想用自制的不可信证书,就在startssl提交了可信证书申请,迟迟不见动静,所以只好自己动手搞一下了。C基础很差,于是先用ngx_lua模块应付一下,有时间再搞搞前辈的第三方验证模块。
功能方面,这段代码并不是RFC2671的完整实现 。所以只能说可以正常工作了,且只支持用户验证(auth),不支持完整验校验(auth-int)。因受限于 lua 随机数生成不够随机,加上可能隐藏的bug,不确保百分百的安全。但在我认真的实验后,个人认为安全的完成用户身份验证已经可以保证了。在IE 11,IE 6 ,firefox 26 ,curl ,wget下测试通过。
配置示例:
点击下载 ngx_http_auth_digest.lua 到本地目录,如/data/ngx_http_auth_digest.lua
修改ngx_http_auth_digest.lua,找到1-4行,根据需要修改密码文件路径、验证域、nonce超时、nonce超时前最大使用次数:
local passfile="/data/htdigest" local realm="pppei.net" local nonce_timeout=60 local nonce_max_use=60
下载 htdigest.py 工具,生成密码文件:
wget https://raw.github.com/samizdatco/nginx-http-auth-digest/master/htdigest.py ./htdigest.py /data/htdigest admin pppei.net
配置nginx
http{ ... #定义 nonce 存储空间大小 lua_shared_dict nonce 1m; ... server{ .... location /auth { default_type text/plain; #修改为auth.lua 存放路径 access_by_lua_file '/data/ngx_http_auth_digest.lua'; content_by_lua 'ngx.say("welcome")'; } } }
reload nginx ,通过浏览器访问 http://<server>/auth 进行测试,有问题欢迎反馈。
local nonce_timeout=60local nonce_max_use=60l看起来没有起作用啊?
这个配置不会重新弹出输入用户密码的框,如果之前验证成功了,密码被浏览器缓存了,nonce失效后,使用新的nonce重新验证是在浏览器和服务器之间自动完成的
[1]