一般的Web应用都有自己的认证登录系统,其实Web Server也内建有基本的HTTP认证功能。这可用保护网站某个目录的内容,只有信任的用户可以访问。
设置Nginx基本HTTP认证
1.创建密码文件
首先我们需要在服务器上创建用户和密码的组合文件.htpasswd,Apache也是使用同样格式的文件。
生成密码对应的hash:
$ openssl passwd -apr1
Password: # 密码 test1234
Verifying - Password:
$apr1$i.UlJG0O$w7DDRWQg7Crufge4t/1j01
把用户名和密码写入到/etc/nginx/.htpasswd:
$ sudo bash -c "echo -n 'snail:$apr1$i.UlJG0O$w7DDRWQg7Crufge4t/1j01' >> /etc/nginx/.htpasswd"
$ cat /etc/nginx/.htpasswd
snail:$apr1$k0lhv2Ch$bVTBznCk4bDUAzXacTFj.0
用户名snail对应的密码test1234。
2.配置Nginx
编辑网站配置文件:
$ sudo vim /etc/nginx/sites-enabled/default
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
....
location /mystaff { # 访问/mystaff目录需要密码
try_files $uri $uri/ =404;
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
}
....
}
重启Nginx:
$ sudo systemctl restart nginx
3.测试
把要保护的网页放到 /var/www/html/mystaff 目录;
使用浏览器访问:your_server_IP/mystaff
HTTP使用BASIC认证的原理及实现方法(转)
BASIC认证概述
在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份证的方法,当一个客户端向HTTP服务器进行数据请求时,如果客户端未被认证,则HTTP服务器将通过基本认证过程对客户端的用户名及密码进行验证,以决定用户是否合法。客户端在接收到HTTP服务器的身份认证要求后,会提示用户输入用户名及密码,然后将用户名及密码以BASE64加密,加密后的密文将附加于请求信息中,如当用户名为anjuta,密码为:123456时,客户端将用户名和密码用“:”合并,并将合并后的字符串用BASE64加密为密文,并于每次请求数据时,将密文附加于请求头(Request Header)中。HTTP服务器在每次收到请求包后,根据协议取得客户端附加的用户信息(BASE64加密的用户名和密码),解开请求包,对用户名及密码进行验证,如果用 户名及密码正确,则根据客户端请求,返回客户端所需要的数据;否则,返回错误代码或重新要求客户端提供用户名及密码。
BASIC认证的过程
1.客户端向服务器请求数据,请求的内容可能是一个网页或者是一个其它的MIME类型,此时,假设客户端尚未被验证,则客户端提供如下请求至服务器:
Get /index.html HTTP/1.0
Host:www.google.com
2.服务器向客户端发送验证请求代码401,服务器返回的数据大抵如下:
HTTP/1.0 401 Unauthorised
Server: SokEvo/1.0
WWW-Authenticate: Basic realm="google.com"
Content-Type: text/html
Content-Length: xxx
3.当符合http1.0或1.1规范的客户端(如IE,FIREFOX)收到401返回值时,将自动弹出一个登录窗口,要求用户输入用户名和密码。
4.用户输入用户名和密码后,将用户名及密码以BASE64加密方式加密,并将密文放入前一条请求信息中,则客户端发送的第一条请求信息则变成如下内容:
Get /index.html HTTP/1.0
Host:www.google.com
Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx
注:xxxx….表示加密后的用户名及密码。
5.服务器收到上述请求信息后,将Authorization字段后的用户信息取出、解密,将解密后的用户名及密码与用户数据库进行比较验证,如用户名及密码正确,服务器则根据请求,将所请求资源发送给客户端
BASIC认证的缺点
HTTP基本认证的目标是提供简单的用户验证功能,其认证过程简单明了,适合于对安全性要求不高的系统或设备中,如大家所用路由器的配置页面的认证,几乎 都采取了这种方式。其缺点是没有灵活可靠的认证策略,如无法提供域(domain或realm)认证功能,另外,BASE64的加密强度非常低,可以说仅 能防止sohu的搜索把它搜到了。当然,HTTP基本认证系统也可以与SSL或者Kerberos结合,实现安全性能较高(相对)的认证系统。
Python HTTP基本认证
方法1:
import urllib2
from base64 import encodestring
url = 'http://XXX.XXX.X.XX'
user = 'a'
passwd = 'aa'
req = urllib2.Request(url)
basestr = encodestring('%s:%s' % (user,passwd))[:-1]
req.add_header('Authorization','Basic %s' % basestr)
f = urllib2.urlopen(req)
方法2:
import urllib2
url = 'http://XXX.XXX.X.XX'
user = 'a'
passwd = 'aa'
hdlr = urllib2.HTTPBasicAuthHandler()
hdlr.add_password('hello',url,user,passwd) ##此处需添入realm
opener = urllib2.build_opener(hdlr)
urllib2.install_opener(opener)
f = urllib2.urlopen(url)
方法3:
import urllib2
url = 'http://XXX.XXX.X.XX'
user = 'a'
passwd = 'aa'
psmg = urllib2.HTTPPasswordMgrWithDefaultRealm()
psmg.add_password(None,url,user,passwd)
hdlr = urllib2.HTTPBasicAuthHandler(psmg)
opener = urllib2.build_opener(hdlr)
urllib2.install_opener(opener)
f = urllib2.urlopen(url)