必须用ssl labs等工具真实扫描才能准确获知nginx tls配置得分,其a+评级依据protocol support(仅tlsv1.2/tlsv1.3)、key exchange(ecdhe+secp256r1/x25519)、cipher suites(全pfs,无rc4/3des/sha-1)、handshake simulation(主流客户端全通过)四大核心项判定。

要准确知道 Nginx 的 TLS 配置在专业安全评估中能拿多少分,不能只看配置文件是否“写了”,必须用真实扫描工具发起握手、模拟客户端行为、逐项打分。主流工具中,SSL Labs(ssllabs-scan)给出的 A+/A/A- 等级最权威,nmap 和 sslscan 则适合快速本地验证。
用 ssllabs-scan 做全量评分(推荐用于正式验收)
SSL Labs 扫描是等保测评和甲方安全审计最常引用的依据。它会检查协议支持、密钥交换、密码套件、证书链、OCSP Stapling、HSTS、重协商等 20+ 项指标,最终给出综合评级和详细扣分点。
- 本地运行:需安装 Go 环境,执行
go install github.com/ssllabs/ssllabs-scan/v3@latest,然后运行ssllabs-scan --grade --usecache --maxage 24h yourdomain.com - 结果中重点关注四项红标项:Protocol Support(仅应显示 TLS 1.2/1.3)、Key Exchange(ECDHE + secp256r1/x25519)、Cipher Suites(全为 PFS 套件,无 RC4/3DES/SHA-1)、Handshake Simulation(Chrome/Firefox/iOS Safari 全部显示“Yes”)
- 若报告出现红色警告,例如 “TLS 1.0 enabled”,直接对应 Nginx 配置里
ssl_protocols是否漏写了 TLSv1.2 TLSv1.3;“Missing HSTS” 就补上add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
用 nmap 快速定位弱套件(适合日常巡检)
nmap 的 ssl-enum-ciphers 脚本不依赖外部服务,能直接列出服务器实际协商出的所有密码套件,并按安全性分级标注,特别适合排查“为什么配置写了却还是被扫出弱算法”。
- 命令示例:
nmap --script ssl-enum-ciphers -p 443 example.com - 输出中看到 TLS_RSA_WITH_AES_128_CBC_SHA 或 TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA 这类带 RSA、3DES、CBC、SHA-1 的套件,说明
ssl_ciphers没生效或被覆盖,需检查是否遗漏ssl_prefer_server_ciphers on - 注意:如果 Nginx 前面有 CDN 或 WAF,nmap 扫的是网关层,不是源站。务必在源站 IP 或内网直连地址上复测,避免误判
用 openssl s_client 逐协议验证(精准诊断握手失败)
当扫描工具报“Fail”但看不出原因时,openssl 是底层排障首选。它绕过所有中间层,直连 Nginx,输出原始握手过程,能明确告诉你到底是协议不支持、套件不匹配,还是证书链断裂。
- 测试 TLS 版本:
openssl s_client -connect example.com:443 -tls1_2(应成功);openssl s_client -connect example.com:443 -tls1_1(应失败并快速退出) - 测试具体套件:
openssl s_client -connect example.com:443 -cipher 'TLS_AES_128_GCM_SHA256' -tls1_3,成功时输出含 New, TLSv1.3 和 Cipher is TLS_AES_128_GCM_SHA256 - 关键技巧:加
-debug参数可看到完整 ClientHello 内容,确认 Nginx 是否真的发出了你期望的协议和套件列表
自动化集成到 CI/CD(防止人为遗漏)
靠人工每次上线前手动跑一遍扫描不可持续。建议在 GitHub Actions 或 Jenkins 中嵌入自动检查,把安全门槛卡在发布前。
- 语法与基础安全检查:
nginx -t -c /etc/nginx/nginx.conf+ 自定义脚本检测是否缺失 HSTS、是否启用了 TRACE/OPTIONS 方法 - TLS 合规性扫描:用
testssl.sh对预发布环境做轻量扫描,设置阈值(如--grade得分低于 A- 则流水线失败) - 示例逻辑:若
testssl.sh --quiet --parallel --grade example.com | grep "Grade:" | grep -q "A[+]*"不成立,就中断部署











