文档中心
Nginx鍙屽悜SSL璇佷功閰嶇疆璇﹁В濡備綍瀹炵幇瀹㈡埛绔笌鏈嶅姟绔弻鍚戣璇侊紵
时间 : 2025-09-27 16:26:37浏览量 : 1
什么是双向SSL证书认证?

在网络安全领域,SSL/TLS证书通常用于验证服务器身份(就是我们常说的HTTPS网站前面的小锁图标)。但有时候,仅仅验证服务器身份还不够安全,我们还需要验证客户端的身份——这就是双向SSL认证(也叫Mutual SSL Authentication)。
举个生活中的例子:普通HTTPS就像你去银行办理业务,你只需要确认柜台工作人员确实是银行的(看工牌);而双向SSL则像是办理大额转账时,银行不仅要向你证明他们是正规银行,还会要求你出示身份证件来证明"你就是你"。
为什么需要双向SSL认证?
1. 高安全性场景:比如企业内部系统、金融交易接口
2. API保护:防止未授权的客户端调用关键API
3. 物联网设备认证:确保只有合法的IoT设备能连接服务器
去年某知名云服务商的API被恶意爬取数据的事件,如果采用了双向SSL认证,就能有效避免这种未授权访问。
Nginx配置双向SSL证书全流程
准备工作
你需要准备:
- 服务器证书(server.crt)
- 服务器私钥(server.key)
- CA根证书(ca.crt)
- (可选)吊销列表CRL文件
如果是测试环境,可以用OpenSSL自己生成:
```bash
生成CA根证书
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
生成服务器证书
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
生成客户端证书
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr
openssl x509 -reqdays3650-inclient.csr-CAca.crt-CAkeyca.key-CAcreateserial-outclient.crt
```
Nginx核心配置
在Nginx的server配置块中添加:
```nginx
server {
listen 443 ssl;
标准单向SSL配置
ssl_certificate /path/to/server.crt;
ssl_certificate_key /path/to/server.key;
开启双向认证
ssl_client_certificate /path/to/ca.crt;
CA根证书,用于验证客户端证书
ssl_verify_client on;
开启客户端验证
(可选)更严格的校验设置
ssl_verify_depth 2;
验证链深度
...其他配置...
}
高级调优参数
ssl_protocols TLSv1.2 TLSv1.3;
禁用老旧协议
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
安全加密套件
ssl_prefer_server_ciphers on;
ssl_session_timeout10m;
ssl_session_cache shared:SSL:10m;
PHP代码示例:获取客户端证书信息
当启用双向认证后,后端代码可以获取客户端证书信息:
```php
// PHP获取客户端证书信息
if (!empty($_SERVER['SSL_CLIENT_CERT'])) {
$cert = openssl_x509_parse($_SERVER['SSL_CLIENT_CERT']);
echo "客户端CN(Common Name): ".$cert['subject']['CN'];
} else {
die("请提供有效的客户端证书");
?>
Java代码示例:带客户端证书的HTTPS请求
```java
// Java使用KeyStore加载客户端证书发起请求
System.setProperty("javax.net.ssl.keyStore", "/path/to/client.p12");
System.setProperty("javax.net.ssl.keyStorePassword", "password");
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(new SSLConnectionSocketFactory(
SSLContexts.createDefault(),
new String[]{"TLSv1.2"},
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier()))
.build();
HttpGet request = new HttpGet("https://yourdomain.com/api");
CloseableHttpResponse response = httpClient.execute(request);
Windows下导入PFX格式的客户单端书
1. 双击.pfx文件
2. 选择"本地计算机"存储位置
3. 输入密码
4. 勾选"标记此密钥为可导出"(测试环境建议勾选)

curl命令测试示例
```bash
curl --cert client.crt --key client.key --cacert ca.crt https://yourdomain.com/api
如果返回403错误,很可能是:
- 问题原因:Nginx没有正确配置`ssl_client_certificate`
- 解决方案:检查CA根证书路径是否正确
Nginx调试技巧
查看详细的TLS握手日志:
```nginx
error_log /var/log/nginx/ssl_error.log debug;
nginx.conf的events块上方添加:
ssl_log /var/log/nginx/ssl.log;
常见错误排查:
1. `peer did not return a certificate` → `ssl_verify_client`设为optional测试是否收到任何证书记录
2. `unable to get local issuer certificate` → CA根证书记录不全
3. `certificate verify failed` → CRL检查失败或证书记录过期
4. `no shared cipher` → ssl_ciphers不兼容
5.TCP连接成功但立即断开 → TLS版本不匹配(比如只允许TLS1.3而旧JDK只支持TLS1.
6)
7)
8)
9)
10)
11)
12)
13)
14)
15)
16)
17)
18)
19)
20)
21)
22)
23)
24)
25)
26)
27)
28)
29)
30)
TAG:nginx 双向ssl证书,nginx的ssl证书,nginx ssl_preread,nginx ssl双向认证,nginx的ssl,nginx ssl pem