nginx下基于ngx_lua 模块实现 http digest(摘要)认证

缘起: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 进行测试,有问题欢迎反馈。

nginx下基于ngx_lua 模块实现 http digest(摘要)认证》有3个想法

    1. ring0 文章作者

      这个配置不会重新弹出输入用户密码的框,如果之前验证成功了,密码被浏览器缓存了,nonce失效后,使用新的nonce重新验证是在浏览器和服务器之间自动完成的

      回复

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据