使用SSL双向认证实现web服务的安全访问
前言
我的NAS上部署了一些服务,使用frp内网穿透的方式让外网去访问,但是为了防止被攻击,只想在某些设备访问。经过查询资料,了解到了ssl双向认证,可以实现外网只有安装了证书的设备才可以访问。
如果访问的时候,服务器发现客户端没有携带证书,就拒绝访问。
操作步骤
生成客户端证书,将客户端证书配置在服务器端nginx上,并且在客户端安装生成的证书并信任。
手机端的Chrome不可用,Safari是可以使用的。
这里不需要服务器https证书的,使用客户端生成证书并且信任即可。
1、生成客户端证书(需要配置在nginx服务器)
# 生成 CA 私钥
openssl genrsa -out ca.key 2048
# 生成 CA 证书
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt
2、签发客户端证书(需要安装在客户端)
# 生成客户端私钥
openssl genrsa -out client.key 2048
# 创建客户端证书签名请求(CSR)
openssl req -new -key client.key -out client.csr
# 使用 CA 签发客户端证书
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 3650 -sha256
3、生成 client.p12 证书,可以安装在Mac和iPhone上
注意:导出的时候最好加上密码,这样即使客户端证书丢了,别人也无法安装。
openssl pkcs12 -export -inkey client.key -in client.crt -out client.p12
4、配置nginx,将第1步生成的ca.crt放在服务器上,并在nginx添加ssl_client_certificate配置。
server {
# 启用客户端证书验证
ssl_verify_client on;
ssl_client_certificate cert/ca.crt;
# 强制使用现代协议和加密算法
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers HIGH:!aNULL:!MD5;
# ... 其他配置
}
5、不安装证书的情况下,是无法访问网站的
查看安装的证书
macOS安装在钥匙串-我的证书下面,并设置信任。
查看效果
使用chrome访问网站的时候就会提示选择本地安装的客户端证书。