HTTPS双向验证(也称为mTLS,双向TLS)要求客户端和服务器都提供证书进行身份验证。以下是完整的配置步骤:
# 1. 创建CA私钥和自签名证书
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
# 2. 创建服务器私钥和证书签名请求(CSR)
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
# 3. 用CA证书签署服务器CSR
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
# 4. 创建客户端私钥和证书签名请求(CSR)
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr
# 5. 用CA证书签署客户端CSR
openssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt
# 6. 将客户端证书转换为PKCS12格式(可选,用于某些客户端)
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
编辑Nginx配置文件(通常在/etc/nginx/nginx.conf
或/etc/nginx/sites-available/default
):
server {
listen 443 ssl;
server_name yourdomain.com;
# 标准SSL配置
ssl_certificate /path/to/server.crt;
ssl_certificate_key /path/to/server.key;
# 启用SSL协议和加密套件
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
# 双向验证配置
ssl_client_certificate /path/to/ca.crt; # 用于验证客户端证书的CA
ssl_verify_client on; # 开启客户端证书验证
ssl_verify_depth 2; # 验证深度
# 可选:指定哪些URL需要双向验证
# location /secure {
# ssl_verify_client on;
# }
# 其他配置...
location / {
root /var/www/html;
index index.html;
# 可选:将客户端证书信息传递给应用
proxy_set_header X-SSL-Client-Cert $ssl_client_cert;
proxy_set_header X-SSL-Client-Verify $ssl_client_verify;
proxy_set_header X-SSL-Client-S-DN $ssl_client_s_dn;
proxy_set_header X-SSL-Client-I-DN $ssl_client_i_dn;
}
}
检查Nginx配置语法:
nginx -t
重启Nginx服务:
systemctl restart nginx
使用curl测试双向验证:
curl --cert client.crt --key client.key --cacert ca.crt https://yourdomain.com
证书验证失败:
错误"SSL peer certificate or SSH remote key was not OK":
性能考虑:
日志查看:
/var/log/nginx/error.log
error_log /var/log/nginx/error.log debug;
根据客户端证书的DN进行访问控制:
if ($ssl_client_s_dn !~* "CN=Allowed User") {
return 403;
}
使用CRL(证书吊销列表):
ssl_crl /path/to/ca.crl;
OCSP Stapling(提高验证效率):
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8;
以上配置提供了完整的HTTPS双向验证实现方案,根据实际需求调整相关参数。