Nginx添加密码认证

Nginx添加密码认证

为什么要给nginx添加密码认证?

为了方便,我们有时候可能会放一些监控脚本在默认的域名下,比如放个phpinfo.php,用于查看php的信息等等,但这个又不想被别人直接访问,而且也不想写个什么登录界面,这时,我们就可以直接用nginx的身份认证功能。

添加了认证是什么效果?

开启了身份认证,访问的时候就需要输入账号和密码。

Xnip2018-11-18_15-56-48.jpg

如果不输入点取消,则会显示需要认证。

Xnip2018-11-18_15-56-57.jpg

怎样添加认证?

把以下两句放在nginx配置文件中的server下或者location里面

auth_basic 'Restricted';            # 认证名称,随意填写
auth_basic_user_file /usr/local/nginx/htpasswd;     # 认证的密码文件,需要生成。

其中/usr/local/nginx/htpasswd是账号密码文件,使用htpasswd命令生成,其中最后两个参数是用户名和密码,到时需要登录的时候就是用这个用户名和密码。

htpasswd -bc /usr/local/nginx/htpasswd zhangsan 123456

如果你服务器没有htpasswd命令,请先安装,htpasswd是apache的一个工具:

yum install -y httpd-tools

以下是我服务器放的例子,注意这不是一个完整配置文件,我只是指明身份认证的两句配置可以放在这个地方:

Xnip2018-11-18_16-18-00.jpg

最后,需要重载一下nginx:
首先检查配置文件是否有语法问题:

sudo nginx -t

如下图,如果显示的是ok,successful,则是对的,如果是failed就说明语法有问题,需要检查一下,比如是否少写分号等等。

Xnip2018-11-18_16-27-31.jpg

语法没问题再重载nginx:

sudo nginx -s reload

认证原理

nginx开启密码认证的原理是使用了HTTP authentication认证机制的basic版HTTP basic authentication,只要向客户端发送以下header即可触发浏览器弹出认证窗口(接收输入用户名和密码),其中『My Realm』可以改成任意其他自己喜欢的字符串:

WWW-Authenticate: Basic realm="My Realm"
HTTP/1.0 401 Unauthorized

其实HTTP authentication认证机制还有另一种,叫HTTP digest authentication,它比basic版的更安全,因为Basic版的认证方式在传输过程中采用的用户名密码加密方式为BASE-64,即类似『base64_encode(username:password)』这样加密的,其解码过程非常简单,如果被嗅探,密码几乎是透明的。

但nginx默认不支持更安全的digest认证方式,如果要支持,需要安装插件HTTP Digest Authentication

使用编程语言实现HTTP authentication

前面已经说了nginx密码认证的原理是HTTP authentication,只需要发送一个http header即可触发浏览器弹出认证窗口,毫无疑问,随便找一门编程语言都可以发送一个header,这里我使用php作为示例:用PHP进行HTTP认证

怎样退出呢?

最好的方法是关闭浏览器再打开,注意是关闭整个浏览器而不是只关闭一个标签,其他退出方式具体请参考How to log out user from web site using BASIC authentication?

打赏

Leave a Reply

avatar

This site uses Akismet to reduce spam. Learn how your comment data is processed.

  Subscribe  
Notify of

扫码在手机查看
iPhone请用自带相机扫
安卓用UC/QQ浏览器扫

Nginx添加密码认证