在 Nginx 中开启客户端证书验证
2024-10-31 04:28:12 # 技术
在折腾个人服务器时,会有一些服务不面向公众,只供自己使用。比如常见的管理面板:宝塔、1Panel、Portainer,这些服务一般只供自己使用,并且需要特别关注安全性。常用的安全措施是使用 2FA、限制 ip 访问。但是 2FA 受限于服务商支持情况,限制 ip 便捷性较差。
客户端证书与服务端证书原理相同,都是采用非对称加密方式。公钥加密,私钥解密。
服务端证书是客户端使用公钥加密,服务端使用私钥解密。除了服务端,第三方无法解密,这样可以防止第三人攻击。
客户端证书与之相反,服务端使用公钥加密,客户端使用私钥解密。这样只有拥有私钥证书的客户端才能与服务器通信。
要在 Nginx 中开启客户端证书验证(即双向 SSL/TLS 认证),需要以下几个步骤:
1. 生成 CA 证书
首先需要有一个自签名的 CA 证书,用于签署客户端证书。
生成 CA 私钥:
openssl genrsa -out ca.key 4096 |
生成自签名 CA 证书:
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt |
这里会要求输入一些信息,如国家代码、组织名称等。生成的 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 |
这里 3650 为证书过期时限,即 3650 天,10 年。
现在你有了 client.crt 和 client.key,这是客户端需要的证书。
3. 配置 Nginx 启用客户端证书验证
配置 Nginx 服务器块
在 Nginx 配置文件中添加或修改 server 块,启用 SSL 并启用客户端证书验证:
server { |
ssl_client_certificate: 指定 CA 证书路径,Nginx 会根据该证书验证客户端证书是否可信。ssl_verify_client on: 强制要求客户端提供证书。如果设置为optional,则客户端可以选择不提供证书。
4. 测试客户端证书验证
使用带有客户端证书的请求测试 Nginx 配置。例如,可以使用 curl 命令行工具:
curl -v --key client.key --cert client.crt --cacert ca.crt https://example.com |
如果客户端证书验证成功,Nginx 会允许请求通过;否则,连接将会被拒绝。
5. 生成 p12 证书
为方便在客户端导入证书,需要将其转换为 Windows/Android 可识别的证书。
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12 |
通过这种方式,可以为网站启用客户端证书验证,加强安全性。