使用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、不安装证书的情况下,是无法访问网站的

border

查看安装的证书

macOS安装在钥匙串-我的证书下面,并设置信任。

border

查看效果

使用chrome访问网站的时候就会提示选择本地安装的客户端证书。

border

留下回复