SSL 的异常种类不多,但每一种的表现和修法都不一样。对号入座就行。

证书已过期

最直接的一种。检测结果会明确标红,剩余天数为负。

处理方式是续签。但更重要的是查为什么没自动续:certbot renew 的定时任务是不是没跑、域名验证是不是失败了、服务器时间是不是错乱、80 端口是不是被关了导致 HTTP-01 验证过不去。

只续签不查原因,90 天后还会再来一次。

证书链不完整

表现是检测提示缺中间证书,但浏览器打开又是正常的。

原因是服务器只配置了站点证书。修法是把中间证书追加到证书文件里:cat site.crt intermediate.crt > fullchain.crt,然后让 Nginx 指向 fullchain。

Let's Encrypt 生成的 fullchain.pem 本身就是完整的,用错文件(比如用了 cert.pem)就会出现这个问题。

域名不匹配

证书是有效的,但上面写的名字跟你要访问的对不上。

先看 SAN 列表,确认到底覆盖了哪些域名。如果确实没覆盖,重新签发一张带这个域名的证书。

如果覆盖了还不匹配,检查是不是 SNI 没生效,导致服务器返回了默认站点的证书。

443 通但握手失败

TCP 能连上,TLS 谈不拢。常见三种原因:

  • TLS 版本过低:服务器只支持 1.0/1.1,客户端已拒绝
  • 加密套件不支持:双方没有共同语言
  • SNI 未配置:多站点共用 IP 时,服务器不知道该给哪张证书

用 openssl s_client -connect host:443 -servername 域名 能看到具体卡在哪一步,报错信息通常很明确。

各地读到不同证书

多节点检测时,不同地区返回的证书不一样。

如果用了 CDN,说明各边缘节点的证书部署不同步,需要联系厂商刷新。如果没用 CDN,那要检查 DNS 是不是把不同地区解析到了不同服务器,而其中某台忘了更新证书。

一个排查顺序

先看有效期,排除过期;再看 SAN,排除不匹配;再看链,排除缺中间证书;最后看协议和套件,排除握手参数问题。

四步下来,SSL 的问题基本都能定位到具体配置项。