TCPing 443 端口通但 HTTPS 报错怎么办?
443 能握手成功,说明 TCP 这一层没问题,网络、防火墙、端口都是通的。报错发生在更上面的 TLS 层。
先看报什么错
浏览器和 curl 给的提示不一样,但都指向具体原因:
- 证书已过期:有效期到了,续签就行
- 证书不受信任:自签名,或者根证书不在信任列表里
- 证书链不完整:缺中间证书,部分客户端能过、部分不能
- 域名不匹配:证书里的 SAN 没有当前域名
- 协议或加密套件不匹配:只支持老旧 TLS 版本
curl 加 -v 能看到完整的握手过程和具体报错,比浏览器的一句「连接不安全」信息量大得多。
证书链是最隐蔽的
很多人只配了服务器证书,忘了中间证书。桌面浏览器因为会自己补全,看起来一切正常;但手机 App、小程序、Java 客户端、部分安卓机型会直接失败。
这种问题最难查,因为「我这里好好的」。用 SSL 检测跑一遍,链上缺哪一环一目了然。
SNI 配置
一台服务器上跑多个 HTTPS 站点时,靠 SNI 区分证书。
如果 Nginx 没配 server_name 对应的证书,或者用了默认证书兜底,客户端请求 A 域名却拿到 B 域名的证书,就会报域名不匹配。
检查方法是按域名分别测,看返回的证书主题是不是对得上。
协议版本
有些老服务器只开了 TLS 1.0/1.1,新版浏览器和客户端已经不支持,握手直接失败。
反过来,如果服务器只开 TLS 1.3,而客户端很老,也会连不上。正常配置应该是 TLS 1.2 + 1.3,兼顾安全和兼容。
怎么快速定位
用 SSL 检测工具看三件事:证书有效期、证书链是否完整、支持的协议版本和加密套件。
这三项里只要有异常,基本就能对应到上面的某一种原因。改完配置记得清缓存再测,浏览器和 CDN 都可能缓存旧证书。