SSL客户端是一种部署简单,使用方便且平台兼容性非常强的加密方式,它不需要设置复杂的密码就可以验证用户是否可信
环境准备
yum install openssl
cd /usr/local/nginx/conf/ssl
mkdir authssl
cd authssl
创建根证书(CA证书)
含密码
openssl genrsa -des3 -out authca.key 4096
不含密码
openssl genrsa -out authca.key 4096
为CA密钥签发证书
openssl req -new -x509 -days 365 -key authca.key -out authca.crt
输入相关信息
至此服务端的相关证书已经创建完成
创建客户端验证证书
openssl genrsa -out authclient.key 4096
openssl req -new -key authclient.key -out authclient.csr
openssl x509 -req -days 3650 -in authclient.csr -CA authca.crt -CAkey authca.key -set_serial 01 -out authclient.crt
openssl pkcs12 -export -clcerts -in authclient.crt -inkey authclient.key -out authclient.p12
部署到Nginx
首先部署一个h5ai来最方便地展示效果
在/data/wwwroot/resource.irain.in目录下创建如下目录树
resource.irain.in
├─ _h5ai
├─ public_resource
└─ private_resouce
如字面意思一般我们希望给private_resource这个目录添加加密
设置Nginx文件
vi /usr/local/nginx/conf/vhost/resource.irain.in.conf
添加内容
ssl_client_certificate /usr/local/nginx/conf/ssl/authssl/authca.crt;
ssl_verify_client on;
此时访问全站就会进入加密状态,如果没有加载客户端证书则会出现下面的Nginx验证失败页面
关于ssl_verify_client on;这一条中
如果把on修改为opitional则验证SSL证书这一过程会变成可选项,可选的结果可以会在$ssl_client_verify这一变量中表现出来
而利用这一方式也就可以使我们达到加密某一目录的目的
ssl_client_certificate /usr/local/nginx/conf/ssl/authssl/authca.crt;
ssl_verify_client optional;
location /private_resource {
if ($ssl_client_verify != SUCCESS) {
return 401;
}
}
此时,private_resouce则已经被加密,在已经安装了authclient证书的设备下就可以直接访问了
PS: 其实客户端服务端一起只用一个CA证书也可以验证的
参考内容
SSL双向认证(高清版)
Module ngx_http_ssl_module
Certificate Authority
转载请标注来源