用 testssl.sh 扫完证书和协议配置后,哪些结果值得当真
一次 SSL/TLS 巡检中 testssl.sh 输出几十行,真正需要处理的往往只有几类。本文说明它的检查范围、常见用法和如何区分协议降级、证书问题与可忽略的低危提示。

巡检时发现一种常见误会:运维把 testssl.sh 的完整输出甩到群里,说"几十个 FAIL,线上要崩了"。点开一看,大部分是 TLS 1.0/1.1 仍可用、某些老密码套件还在这种提示——业务根本不要求兼容旧客户端的话,这些不是事故,只是清洁度问题。
先分清它到底在查什么。testssl.sh 的检查范围大致四块:证书本身(有效期、链是否完整、域名匹配、过期时间)、协议版本支持(SSLv2 到 TLS 1.3 哪些还开着)、密码套件和密钥交换(有没有弱套件、Forward Secrecy 是否覆盖),以及常见漏洞探测(Heartbleed、POODLE、ROBOT 之类)。它不动你的私钥,只做握手测试,所以可以安全地对生产域名跑。

最省的用法就是一条命令:
testssl.sh example.com
输出会很长。想抓重点,建议加 --fast 只看协议和证书,或者用 -U 只跑漏洞检查;需要留档时加 --jsonfile report.json 方便事后 grep 或进工单系统。内网服务加 --assume-http 或指定端口:testssl.sh 10.0.0.5:8443。
结果解读上有个简单的优先级判断:

- 马上处理的:证书过期或链不完整(客户端直接报错)、Heartbleed 之类被标记 vulnerable 的漏洞、域名和证书不匹配。
- 按兼容性要求决定的:TLS 1.0/1.1 是否禁用、弱套件是否清除。PCI 之类的合规场景必须关,面向公众的站点可以只保留 TLS 1.2+。
- 基本可忽略的:部分 cipher 顺序建议、HSTS 时长提示这类最佳实践噪音,视情况排期,不必当成线上事件。
小坑两个:一是它对某些负载均衡或 CDN 后面的域名,测到的是边缘节点的配置,不是源站的——别把 CDN 的 TLS 设置误当成自己 Nginx 配错了;二是输出里的 "offered (deprecated)" 不等于 "fail",它只是告诉你还在提供,要不要关是你的取舍。

在 CertbotX 中实践:testssl.sh 这类扫描适合作为部署后的验收手段。CertbotX 侧负责的是上游环节——通过 DNS-01 CNAME 委托完成域名验证、ACME 自动签发并在到期前重新签发,再把新证书推送到 Agent、EdgeOne 或 CDN,并保留部署记录与审计。证书这条链路自动化之后,testssl.sh 的角色就从"催你换证"变成纯粹的协议与漏洞巡检,两者正好分工。
想核对漏洞标注的含义和协议细节,可以看: