ssl新闻资讯

文档中心

Nginx鍙屽悜SSL璇佷功閰嶇疆璇﹁В濡備綍瀹炵幇瀹㈡埛绔笌鏈嶅姟绔弻鍚戣璇侊紵

时间 : 2025-09-27 16:26:37浏览量 : 1

什么是双向SSL证书认证?

2Nginx鍙屽悜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. 勾选"标记此密钥为可导出"(测试环境建议勾选)

![Windows导入PFX流程图](https://example.com/pfx_import.png)

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