1. 为什么需要忽略HTTPS证书验证?
在企业内部网络架构中,Nginx作为反向代理服务器时,经常会遇到需要代理到后端HTTPS服务的情况。当后端服务使用自签名证书或证书链不完整时,Nginx默认的严格证书验证机制会导致代理失败。我在实际运维中就遇到过这样的场景:某金融系统的测试环境使用内部CA签发的证书,导致Nginx代理时不断报错"SSL certificate verify failed"。
这种情况下,我们有三种选择:
- 将自签名证书加入Nginx的信任链(适合长期稳定环境)
- 购买正式证书(适合生产环境)
- 临时关闭证书验证(适合测试/开发环境)
重要提示:忽略证书验证会降低安全性,仅建议在测试环境或可信内网中使用。生产环境应始终确保完整的证书验证链。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心配置参数解析
2.1 proxy_ssl_verify
这是控制证书验证的核心指令,语法为:
nginx复制proxy_ssl_verify on | off;
设置为off时,Nginx将不会验证后端服务器的证书有效性。这个参数需要放在location或server块内:
nginx复制location /api/ {
proxy_pass https://backend;
proxy_ssl_verify off;
}
2.2 proxy_ssl_trusted_certificate
即使关闭验证,有时仍需要指定CA证书路径:
nginx复制proxy_ssl_trusted_certificate /path/to/ca.crt;
这个参数在混合环境(部分证书需要验证,部分不需要)时特别有用。
2.3 proxy_ssl_server_name
当后端使用SNI(Server Name Indication)时需启用:
nginx复制proxy_ssl_server_name on;
否则可能出现证书域名不匹配的错误。我在某次迁移中就遇到这个问题:后端服务升级到支持SNI的TLS 1.3后,代理突然开始报错"SSL: no alternative certificate subject name matches target host name",就是这个参数没配置。
3. 完整配置示例
3.1 基础忽略验证配置
nginx复制server {
listen 80;
server_name proxy.example.com;
location / {
proxy_pass https://internal-server;
proxy_ssl_verify off;
proxy_ssl_session_reuse on;
}
}
3.2 带SNI的高级配置
nginx复制upstream backend {
server 192.168.1.10:443;
server 192.168.1.11:443 backup;
}
server {
listen 443 ssl;
server_name proxy.example.com;
ssl_certificate /etc/nginx/ssl/proxy.crt;
ssl_certificate_key /etc/nginx/ssl/proxy.key;
location /app/ {
proxy_pass https://backend;
proxy_ssl_verify off;
proxy_ssl_server_name on;
proxy_ssl_name $proxy_host; # 显式指定SNI名称
proxy_set_header Host $host;
}
}
4. 常见问题排查
4.1 配置生效但连接被拒绝
检查顺序:
- 确认后端HTTPS服务确实在监听指定端口
- 检查防火墙规则(常见于云环境安全组配置)
- 验证Nginx worker进程的权限(特别是SELinux环境)
4.2 报错"peer closed connection"
可能原因:
- 后端服务期望特定的HTTP头
- TLS版本不匹配(尝试调整proxy_ssl_protocols)
- 空闲连接超时(调整proxy_ssl_session_timeout)
4.3 性能优化建议
虽然关闭验证能解决问题,但会带来性能损耗:
- 开启会话复用:
proxy_ssl_session_reuse on; - 调整缓冲区大小:
nginx复制proxy_ssl_buffer_size 16k;
proxy_buffers 8 16k;
- 设置合理的超时:
nginx复制proxy_ssl_handshake_timeout 10s;
proxy_ssl_session_timeout 5m;
5. 安全注意事项
即使在内网环境,也应考虑以下安全措施:
- 限制访问IP:
nginx复制allow 10.0.0.0/8;
deny all;
- 记录详细日志:
nginx复制log_format ssl_proxy '$remote_addr - $ssl_protocol '
'$ssl_cipher "$request"';
access_log /var/log/nginx/ssl_proxy.log ssl_proxy;
- 定期检查配置:
bash复制nginx -t && systemctl reload nginx
我在某次安全审计中发现,一个临时关闭验证的配置被遗忘在生产环境长达半年,导致中间人攻击风险。因此建议所有临时配置都添加注释说明原因和过期时间:
nginx复制# TEMP: 忽略证书验证 - 测试环境自签名证书
# 到期: 2023-12-31 负责人:张三
proxy_ssl_verify off;
通过合理的配置管理,可以在保证功能可用的同时,将安全风险控制在可接受范围内。对于长期需要忽略验证的场景,建议还是走正规证书申请流程,或者搭建内部PKI体系。
