必须禁用TLSv1.0和TLSv1.1,因其存在POODLE、BEAST等已知漏洞,不支持AEAD、前向保密和完整SNI,且违反PCI DSS、GDPR、等保2.0等合规要求;Nginx中需在每个server块明确配置ssl_protocols TLSv1.2 TLSv1.3,并配合强加密套件与ssl_prefer_server_ciphers on。

直接在 Nginx 的 server 或 http 块中设置 ssl_protocols,明确只保留 TLSv1.2 和 TLSv1.3,就能强制禁用 TLS 1.0 和 TLS 1.1。这不是“可选优化”,而是 HTTPS 安全部署的底线要求。
核心配置写法必须精准
在启用 HTTPS 的 server 块内添加以下指令:
-
ssl_protocols TLSv1.2 TLSv1.3;—— 注意:不能多写空格、不能漏分号、不能包含TLSv1或TLSv1.1字样 - 避免写成
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;,哪怕只是多一个旧版本,Nginx 就可能允许降级协商 - 若使用多个虚拟主机(多个
server块),每个块都必须单独配置,共用 listen 但未显式声明协议时,会继承全局或第一个匹配块的策略
必须配合加密套件与协商控制
光禁协议不够,客户端仍可能用弱算法建立 TLS 1.2 连接。需同步加固:
- 指定强密钥交换和认证方式:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; - 禁用所有含
RC4、MD5、SHA1、DES、3DES的套件 - 启用服务端优先:
ssl_prefer_server_ciphers on;,防止客户端绕过服务器策略选择弱算法
验证是否真正生效
修改后重载 Nginx(nginx -t && nginx -s reload),再用命令实测:
- 测试 TLS 1.1 是否被拒:
openssl s_client -connect your-domain.com:443 -tls1_1 -servername your-domain.com→ 应返回连接失败或 handshake error - 测试 TLS 1.2 是否可用:
openssl s_client -connect your-domain.com:443 -tls1_2 -servername your-domain.com→ 应成功完成握手并显示证书信息 - 用
nmap --script ssl-enum-ciphers -p 443 your-domain.com查看完整支持列表,确认输出中不再出现TLSv1.0或TLSv1.1区块
常见失效原因排查
即使写了配置,扫描工具仍报 TLS 1.1,大概率是以下情况之一:
- 存在多个虚拟主机配置文件(如
/etc/nginx/sites-enabled/下多个 conf),只改了其中一个 - 域名解析指向了另一台未更新的服务器(检查
ping your-domain.com返回的 IP 是否是你操作的机器) - 使用了 CDN 或反向代理(如 Cloudflare、阿里云 WAF),实际 TLS 终止不在 Nginx,需在 CDN 后台统一设置
- OpenSSL 版本过低(低于 1.1.1),不支持 TLS 1.3 或无法正确识别新协议限制,需升级系统 OpenSSL 或 Nginx 编译环境











