proxy_ssl_ciphers专门控制Nginx主动连接后端HTTPS服务时的TLS加密套件,仅作用于上游链路;必须按冒号分隔严格排序、剔除弱算法,并与proxy_ssl_protocols等指令协同生效。

proxy_ssl_ciphers 专门控制 Nginx 主动连接后端 HTTPS 服务时使用的 TLS 加密套件,它不作用于用户访问 Nginx 的链路,只影响反向代理发往后端的那部分通信。安全强度提升的关键在于:明确列出强算法、严格排序、剔除已淘汰项,并与协议、证书验证等指令协同生效。
只列可信套件,顺序即协商优先级
该指令按冒号分隔的顺序逐个尝试,Nginx 不支持服务端优选(没有 proxy_ssl_prefer_server_ciphers),你写的顺序就是最终行为。因此:
- 把前向保密好、AEAD 模式、主流兼容的套件放在最前,例如
ECDHE-RSA-AES128-GCM-SHA256 - 避免在列表末尾加
!aNULL:!MD5:!RC4等“过滤”写法——这些无法覆盖前面已列出的弱套件,应从源头只选安全项 - 若后端仅支持 ChaCha20(如某些移动网关),就把
CHACHA20-POLY1305-SHA256放首位
必须配合 proxy_ssl_protocols 才能真正启用强套件
加密套件和 TLS 版本强绑定。例如 ECDHE+AES-GCM 套件在 TLS 1.2 下可用,在 TLS 1.0 下不可用;而 TLS 1.3 只接受 TLS_AES_256_GCM_SHA384 这类原生组合。所以:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 若想启用 AES-GCM 类套件,需至少配置
proxy_ssl_protocols TLSv1.2 TLSv1.3; - 若强制只走 TLS 1.3,则
proxy_ssl_protocols TLSv1.3;必须单独写,且proxy_ssl_ciphers只能填 TLS 1.3 套件名,如TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 - 混写
TLSv1.2 TLSv1.3会导致协商降级,削弱安全性
位置和作用域不能错,否则完全不生效
该指令不是全局设置,不会从 http 块继承,必须显式出现在生效的作用域内:
- 只对
proxy_pass https://...的 location 或 upstream 块有效;若回源是 HTTP,此指令被忽略 - 推荐写在具体 location 中,与
proxy_pass同级,例如:
proxy_pass https://backend;
proxy_ssl_protocols TLSv1.2 TLSv1.3;
proxy_ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
}
- 写在 http 块顶层或 server 块但未关联 https 回源,配置无效
验证是否真起作用,别只看语法检查
配置写对 ≠ 握手成功。常见失效原因包括套件不匹配、证书校验失败、SNI 缺失等:
- 开启 debug 日志:
error_log /var/log/nginx/error.log debug;,查找SSL accepted cipher:或SSL_do_handshake() failed - 用 openssl 手动测试单个套件:
openssl s_client -connect backend:443 -cipher 'ECDHE-RSA-AES128-GCM-SHA256' -tls1_2 - 若后端证书 SAN 是
api.internal,但proxy_pass写的是 IP,需额外加proxy_ssl_name "api.internal";和proxy_ssl_server_name on;

















