7. 配置web身份认证
需要输入用户名和密码才能访问站点的功能为web身份认证功能。nginx中由ngx_http_auth_basic_module模块提供该功能。指令包括auth_basic和auth_basic_user_file。这两个指令可以在http根段、server段、location段使用。
auth_basic string | off auth_basic_user_file path/to/user_passwd_file # 密码文件使用相对路径时是相对conf目录的passwd_file的格式为:
user1:passwd1 user2:passwd2需要注意的是,密码文件不能使用明文密码的方式。该类文件一般使用apache提供的工具htpasswd生成,该工具在httpd-tools包中,具体用法见htpasswd命令。也可以使用openssl passwd生成相关密码然后复制到密码文件中。以下是一个示例:
server { listen 80; server_name www1.longshuai.com; location / { root /www/longshuai/; index index.html index.htm; auth_basic "Auth your name"; auth_basic_user_file /usr/local/nginx/htpasswd; } }然后使用htpasswd生成密码文件/usr/local/nginx/conf/htpasswd。
yum -y install httpd-tools htpasswd -b -c -m /usr/local/nginx/conf/htpasswd Jim 123456 htpasswd -b -m /usr/local/nginx/conf/htpasswd Tom 123456-b选项是表示batch模式,不用交互输入密码。-c表示创建密码文件,只能为第一个用户使用该选项,否则后面使用会覆盖前面已经创建过的。-m表示强制使用md5。Jim和Tom是需要验证的用户名,123456是密码。查看生成的密码文件。
[root@xuexi nginx]# cat htpasswd Jim:$apr1$URdS8lcY$GyghBlYInlqfkto0ndnH1. Tom:$apr1$B/orDxHj$1jIWk1X5XabpH3hcFQzoN1然后重载配置文件,在浏览器中测试。测试时最好不要用IE。
也可以使用openssl passwd生成,下面的"-apr1"(数值1而非字母L的小写)选项是为apache密码做相关支持的。
openssl passwd -apr1 123456 $apr1$rD/3/kFH$L8KYfzAWFtHO8mOiR9dci1 # 或者加点盐 openssl passwd -apr1 -salt 'xyz' 123456 $apr1$xyz$j0n99G44SENB4NmJiwEfJ0然后将得到的密码复制到密码文件中对应的用户名后面即可。如将得到的"$apr1$xyz$j0n99G44SENB4NmJiwEfJ0"作为"Admin"用户的验证密码。
Admin: $apr1$xyz$j0n99G44SENB4NmJiwEfJ0 8 配置httpshttps功能由ngx_http_ssl_module模块提供。https连接的认证过程见SSL握手机制。(见 ) 简单版的过程如下:
客户端say hello,并发送一个随机数给服务端。
服务端say hello,并回复一个随机数给客户端。
服务端发送数字证书给客户端。
客户端使用信任的CA公钥解密数字证书得到服务端的公钥。
客户端使用服务端的公钥加密一个预备主密钥并发送给服务端。
服务端使用自己的私钥解密预备主密钥。
双方都得到了2个随机数加一个预备主密钥。通过这3个随机数形成一个会话主密钥,即session key。至此ssl握手结束,连接的认证过程也完毕。
对于服务端而言,在配置https时,需要提供自己的数字证书用于发送给客户端,还要提供自己的私钥用于解密客户端发送的预备主密钥。当ssl连接建立完成后,后续连接要传输的数据都采用session key进行加密,但注意session key是对称加密,客户端和服务端是一样的。
还需注意,在创建证书请求时,由于需要指定common name,这是需要使用https的站点,因此每个ssl证书只能为一个server_name提供https服务。
以下是配置文件中默认的关于SSL相关的指令设置。
#server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #}以下是建立https的相关过程:
自建CA。 cd /etc/pki/CA (umask 077;openssl genrsa -out private/cakey.pem 2048) openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
建立相关序列和索引文件。 touch index.txt echo "01" > serial
nginx端生成证书请求。 (umask 077;openssl genrsa -out /usr/local/nginx/longshuai.key 2048) openssl req -new -key /usr/local/nginx/longshuai.key -out /usr/local/nginx/longshuai.csr
CA为证书请求颁发证书。 openssl ca -in /usr/local/nginx/longshuai.csr -out longshuai.crt
将颁发的证书发送给nginx端。这里由于CA和nginx在同一主机上,所以直接移动即可。 mv longshuai.crt /usr/local/nginx/ 此时,在/usr/local/nginx/目录下就有了nginx自己的私钥文件和证书文件。 [root@xuexi nginx]# ls longshuai* longshuai.crt longshuai.csr longshuai.key
修改配置文件,配置ssl相关选项。
server { listen 443 ssl; server_name ; ssl_certificate /usr/local/nginx/longshuai.crt; ssl_certificate_key /usr/local/nginx/longshuai.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } }重载配置文件。
测试。在浏览器上输入https:\\测试。将会提示证书安全存在问题,说明配置成功。以后只要在客户端安装证书即可正常访问。
下面关于Nginx的文章您也可能喜欢,不妨参考下:
CentOS 7下Nginx服务器的安装配置
CentOS 6.8 安装LNMP环境(Linux+Nginx+MySQL+PHP)
Linux下安装PHP环境并配置Nginx支持php-fpm模块
Ubuntu 16.04上启用加密安全的Nginx Web服务器