SSL/TLS加密强度不能按域名动态切换cipher,但可通过为各域名配置独立server块实现差异化ssl_ciphers设置;每个server块需完整定义证书、协议、cipher等参数,并用openssl验证实际协商结果。

SSL/TLS 加密强度不能直接通过 ssl_ciphers 按「域名」单独调优,因为该指令是 Nginx(或 OpenSSL)在 TLS 握手阶段生效的**全局或 server 块级配置项**,不支持基于 SNI 域名动态切换 cipher suite 列表。但你可以通过合理组织 server 块实现「逻辑上针对特定域名差异化配置加密策略」。
明确作用域限制:ssl_ciphers 不支持 per-SNI 动态选择
Nginx 的 ssl_ciphers 必须写在 http、server 或 location 块中,而 location 不支持 TLS 参数;server 块可绑定特定 server_name,但 cipher list 在 SSL 握手早期(ClientHello 之后、ServerHello 之前)即需确定——此时 SNI 已送达,Nginx 可据此选择对应 server 块,进而应用其独立的 ssl_ciphers 设置。因此,按域名差异化配置 cipher 是可行的,前提是每个域名使用独立的 server 块。
为不同域名配置独立的 server 块并指定 cipher
确保每个需要定制加密强度的域名都有专属的 server 块,并在其中显式声明 ssl_ciphers 和配套参数:
- 为高安全要求域名(如 admin.example.com)启用强 cipher,禁用弱算法:
server {
listen 443 ssl http2;
server_name admin.example.com;
ssl_certificate /path/to/admin.crt;
ssl_certificate_key /path/to/admin.key;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';
ssl_prefer_server_ciphers off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ecdh_curve secp384r1;
}
- 为兼容老旧客户端的域名(如 legacy.example.com)适度放宽 cipher 范围(仅限必要场景):
server {
listen 443 ssl http2;
server_name legacy.example.com;
ssl_certificate /path/to/legacy.crt;
ssl_certificate_key /path/to/legacy.key;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_dhparam /etc/nginx/dhparam.pem; # 若含 DHE,需提供 DH 参数
}
验证与注意事项
- 必须为每个 server 块配齐完整 SSL 配置(证书、私钥、协议、cipher),不可依赖上级块继承全部参数;
- 使用
nginx -t测试语法,重启后用openssl s_client -connect admin.example.com:443 -servername admin.example.com实际验证协商出的 cipher; - TLSv1.3 的 cipher suite 由协议本身定义,
ssl_ciphers对其影响有限(仅控制是否启用 TLSv1.3),实际加密套件由客户端和服务端共同决定; - 避免混用不安全 cipher(如
RC4、MD5、SSLv3、EXPORT等),即使为兼容也应严格评估风险。
进阶:运行时 cipher 选择(需模块支持)
标准 Nginx 不支持基于请求头或变量动态设置 ssl_ciphers。若需更灵活策略(例如根据 User-Agent 或 IP 地址调整),可考虑:
- 使用 Cloudflare 的 nginx patches(非主线功能);
- 改用支持动态 TLS 配置的反向代理(如 Envoy + Lua filter 或 Caddy v2 的 TLS 钩子);
- 在前端负载均衡器(如 HAProxy)层做 SNI 分流,再导向不同 Nginx 实例——间接实现 per-domain cipher 策略。


















