SSL 证书检测异常怎么判断
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 的问题基本都能定位到具体配置项。