Nginx 支持对特定 upstream 域名禁用上游 HTTPS 证书校验,通过 location 块中 proxy_ssl_verify off 实现,仅影响该代理路径,不影响其他路由的严格验证。

Nginx 本身不支持对特定域名“关闭 SSL 验证”——这个说法存在根本性误解。需要先厘清两个关键点:
- SSL 验证(ssl_verify_client)是针对客户端证书的校验,不是针对上游服务器证书的验证;
-
Nginx 作为反向代理时,若 proxy_pass 指向 HTTPS 后端,它默认会验证该后端的 SSL 证书(即服务端证书)是否可信;而所谓“关闭 SSL 验证”,实际是指禁用对上游 HTTPS 服务器证书的信任检查,这通过
proxy_ssl_verify off实现,且作用于location或server块内,可按需控制。
所以你真正想做的,很可能是:
✅ 在某个
location(例如代理到特定内部域名如https://internal-api.example.com)时,跳过对上游 HTTPS 服务证书的校验(比如它用了自签名证书或私有 CA),同时不影响其他路径的严格验证。
以下是具体配置方式:
针对特定 upstream 域名禁用上游证书校验
upstream internal_api {
server internal-api.example.com:443;
}
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
location /api/internal/ {
proxy_pass https://internal_api;
proxy_ssl_verify off; # ? 关键:禁用对 upstream 证书的验证
proxy_ssl_trusted_certificate /etc/nginx/ssl/ca-bundle.crt; # 可选:仍可指定信任的 CA(但 off 时无效)
proxy_ssl_protocols TLSv1.2 TLSv1.3;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /api/public/ {
proxy_pass https://public-api.example.com; # 此处保持默认校验(on)
}
}
⚠️ 注意事项:
-
proxy_ssl_verify off必须配合proxy_ssl_trusted_certificate(即使不生效也建议保留占位)和proxy_ssl_protocols显式设置,避免 Nginx 报错; - 禁用证书校验会带来安全风险(如中间人攻击),仅限内网、测试环境或完全可信的私有服务使用;
- 不能在
http块全局关掉,必须在具体的location或upstream+proxy_pass上下文中控制; -
ssl_verify_client(客户端证书校验)与此无关,它是面向访客的双向认证,不可用于“关闭对某域名的 SSL 验证”。
如果你本意是“让某个域名走 HTTP 而非 HTTPS”
那不属于“关闭 SSL 验证”,而是不启用 HTTPS 监听:
server {
listen 80;
server_name legacy.example.com;
location / {
proxy_pass http://backend-app;
proxy_set_header Host $host;
}
}
此时该域名压根不走 SSL/TLS,自然无验证一说。
不复杂但容易忽略。











