nginx做代理https遇到SSL_do_handshake()握手失败

这个问题真的时,困扰我一段时间了,反向代理时,设置了

proxy_ssl_protocols XXXX;
#proxy_ssl_ciphers   ECC-SM4-SM3;
proxy_ssl_session_reuse off;

一开始的时候由于看到了这个:

proxy_ssl_session_reuse指令配置,当下一次nginx转发一个连接到后端服务器时,会话参数会被重复使用,从而更快的建立安全连接。

乍一看,好像说的挺对,就是节省时间了,然后就配置成了on,结果呢,只能成功访问一次,在次访问的时候,就报错了,抓包看的话,会发现在SSL握手中,SSL协议的版本,已经不是上面使用proxy_ssl_protocols 设置的协议了,当然握手失败了,

另外一种说法是:

根据反馈是短时间内连续性请求则会返回502错误,查询资料发现nginx默认会尝试重新使用SSL上游的SSL会话。

改成 proxy_ssl_session_reuse off;  问题解决。

<think>我们正在解决用户遇到的错误:配置Nginx时出现`no proxy_ssl_trusted_certificate for proxy_ssl_verify`错误。 这个错误通常发生在以下情况: 1. 启用了`proxy_ssl_verify`(用于验证上游服务器的证书)但没有配置`proxy_ssl_trusted_certificate`(或`proxy_ssl_verify_depth`)来指定信任的CA证书。 2. 配置了`proxy_ssl_trusted_certificate`但路径错误或权限问题。 解决方案: 1. 确保在配置了`proxy_ssl_verify on;`的同时,配置`proxy_ssl_trusted_certificate`指向一个包含信任的CA证书链的文件(通常为PEM格式)。 2. 检查证书文件路径是否正确,以及Nginx进程是否有读取权限。 3. 如果需要,可以设置`proxy_ssl_verify_depth`来指定证书链验证深度。 注意:`proxy_ssl_trusted_certificate`文件应包含一个或多个信任的CA证书,用于验证上游服务器的证书。这个文件与`proxy_ssl_certificate`不同,后者是客户端证书(用于双向SSL认证)。 示例配置: 在`location`或`server`块中(与`proxy_pass`一起): proxy_ssl_verify on; proxy_ssl_trusted_certificate /path/to/trusted_ca_cert.pem; proxy_ssl_verify_depth 2; # 可选,默认值为1 如果没有可用的CA证书文件,可以尝试使用系统的CA证书,例如: proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt; # 在Ubuntu/Debian上 proxy_ssl_trusted_certificate /etc/pki/tls/certs/ca-bundle.crt; # 在CentOS/RHEL上 如果确实不需要验证上游服务器的证书(不推荐,存在安全风险),可以关闭验证: proxy_ssl_verify off; 但为了安全,建议总是开启验证并使用正确的CA证书。 另外,如果上游服务器使用的是自签名证书,那么需要将自签名证书的CA证书(或服务器证书本身)添加到`proxy_ssl_trusted_certificate`指定的文件中。 步骤: 1. 创建或获取CA证书文件(PEM格式)。 2. 在Nginx配置中指定该文件路径。 3. 测试配置:`sudo nginx -t` 4. 重载Nginx:`sudo nginx -s reload` 权限问题处理(如果Nginx无法读取文件): sudo chmod 644 /path/to/trusted_ca_cert.pem sudo chown root:root /path/to/trusted_ca_cert.pem # 或者改为Nginx运行用户 如果使用Docker,确保证书文件已挂载到容器内,并且路径正确。 下面是一个完整的配置示例(以微信支付代理为例):</think>### 解决 "no proxy_ssl_trusted_certificate for proxy_ssl_verify" 错误 这个错误表明您启用了上游服务器证书验证 (`proxy_ssl_verify on`),但未配置受信任的CA证书文件 (`proxy_ssl_trusted_certificate`)。以下是完整解决方案: --- ### 错误原因分析 1. **缺少CA证书链配置**:`proxy_ssl_verify`需要`proxy_ssl_trusted_certificate`指定受信任的CA证书 2. **证书路径错误**:指定的CA证书文件不存在或路径不正确 3. **权限问题**:Nginx进程无权读取证书文件 4. **证书格式错误**:CA证书不是PEM格式 --- ### 完整修复方案 ```nginx location /wechat-api/ { proxy_pass https://api.mch.weixin.qq.com; # 客户端证书配置 proxy_ssl_certificate /etc/nginx/certs/client.crt; proxy_ssl_certificate_key /etc/nginx/certs/client.key; # 修复错误的关键配置 ▼ proxy_ssl_verify on; # 启用上游证书验证 proxy_ssl_trusted_certificate /etc/nginx/certs/wechat_ca_bundle.crt; # 微信支付CA证书链 proxy_ssl_verify_depth 2; # 验证深度 # 安全增强配置 proxy_ssl_protocols TLSv1.2 TLSv1.3; proxy_ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256'; proxy_ssl_session_reuse on; } ``` --- ### 关键配置说明 | 配置项 | 作用 | 必需 | |-------|------|------| | `proxy_ssl_trusted_certificate` | 指定受信任的CA证书链文件(PEM格式) | ✅ | | `proxy_ssl_verify on` | 启用上游服务器证书验证 | ✅ | | `proxy_ssl_verify_depth` | 设置证书链验证深度(微信推荐≥2) | 推荐 | | `proxy_ssl_ciphers` | 安全加密套件(参考微信要求) | 推荐 | --- ### 分步解决指南 1. **获取微信支付CA证书链** ```bash # 下载微信支付根证书 curl -o wechat_root_ca.crt https://www.wosign.com/cert/rootca.crt # 创建证书链文件 cat wechat_root_ca.crt > /etc/nginx/certs/wechat_ca_bundle.crt ``` 2. **验证证书链完整性** ```bash openssl verify -CAfile /etc/nginx/certs/wechat_ca_bundle.crt \ -untrusted /etc/nginx/certs/client.crt # 应返回 "OK" ``` 3. **修复文件权限** ```bash chmod 644 /etc/nginx/certs/*.crt chown nginx:nginx /etc/nginx/certs/ -R # 根据实际Nginx用户调整 ``` 4. **配置验证深度(微信支付要求)** ```nginx proxy_ssl_verify_depth 2; # 验证完整证书链 ``` 5. **测试并重载配置** ```bash nginx -t && nginx -s reload ``` --- ### 微信支付特殊配置要点 1. **强制域名验证** ```nginx proxy_ssl_name api.mch.weixin.qq.com; # 验证证书域名 proxy_set_header Host api.mch.weixin.qq.com; ``` 2. **证书自动更新机制** ```bash # 证书更新脚本示例 #!/bin/bash NEW_CERT="/path/to/new_ca_bundle.crt" CONFIG_FILE="/etc/nginx/nginx.conf" cp $NEW_CERT /etc/nginx/certs/wechat_ca_bundle.crt nginx -t && nginx -s reload || echo "Reload failed" ``` 3. **错误日志监控** ```bash # 实时监控SSL握手错误 tail -f /var/log/nginx/error.log | grep "SSL_do_handshake" ``` --- ### 完整配置模板 ```nginx http { # 优化SSL设置 [^1] ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH; ssl_prefer_server_ciphers on; server { listen 443 ssl; server_name pay.example.com; # 服务器证书 ssl_certificate /etc/nginx/certs/server.crt; ssl_certificate_key /etc/nginx/certs/server.key; location /v3/ { proxy_pass https://api.mch.weixin.qq.com/v3/; # 微信支付客户端证书 proxy_ssl_certificate /etc/nginx/certs/wx_client.crt; proxy_ssl_certificate_key /etc/nginx/certs/wx_client.key; # 修复验证错误的核心配置 proxy_ssl_verify on; proxy_ssl_trusted_certificate /etc/nginx/certs/wx_ca_bundle.crt; proxy_ssl_verify_depth 2; proxy_ssl_name api.mch.weixin.qq.com; # 安全增强 proxy_ssl_protocols TLSv1.2; proxy_ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384'; proxy_ssl_session_reuse on; } } } ``` 通过以上配置,可彻底解决 `no proxy_ssl_trusted_certificate for proxy_ssl_verify` 错误,并满足微信支付的安全要求[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值