浏览器好好的,App 说证书不可信

以前遇到过一次:电脑上打开站点小锁正常,安卓端却弹证书错误。我第一反应是证书买错了,折腾半天重新申请,问题照旧。

后来才搞明白,证书本身没毛病,是证书链没发全。桌面浏览器遇到缺中间证书,会自己顺着地址去补;有些客户端不会补,拿不到完整链路就直接判失败。

根证书不在你的服务器上

这点最容易搞反。根证书是预装在操作系统、浏览器、手机里的那批受信任证书,属于客户端的信任基础,不需要你上传,也没法靠上传解决。

服务器在握手时发出去的是自己的叶证书,加上中间证书。根证书一般不发送,因为对方本地就有。验证的时候,客户端从叶证书往上追:叶证书由中间证书签发,中间证书由根证书签发,最后对到本地信任库里的那一条。

链路里缺一环,验证就断在那里。

SSL 检测:证书有效期、证书链与 TLS 信息

SSL 检测:证书有效期、证书链与 TLS 信息

所以问题常常出在中间证书

只部署了叶证书、忘了配中间证书,是线上最常见的一种配置缺失。桌面端可能没事,移动端、命令行工具、部分小程序环境就会报错。

反过来,把根证书也塞进服务器发送的链里,同样是坏习惯:包体变大,有些客户端还会认为配置不规范。该发的是叶证书和中间证书,顺序也要对。

拨测里我按这个顺序看

用宝塔拨测的 SSL 检测跑一次,先看证书链详情:颁发机构是谁、链上有几级、完整性有没有问题。缺中间证书这类问题,在这里比在浏览器里点小锁直观得多。

接着看有效期和覆盖域名。剩余时间少于一个月就该安排续期,SAN 里没有当前访问的域名,浏览器照样会警告。

再看协商出来的 TLS 版本和加密套件。443 端口能连上但握手失败,多半是协议版本太低、套件不被支持,或者 SNI 没配对。

各地结果不一样,先别急着改配置

SSL 检测是多地区多运营商节点发起的,会给出响应最快、响应最慢和平均响应。不同地区握手耗时差一些很正常,线路远近、边缘节点位置都会影响。

如果只是某几个地区慢,其他都正常,先怀疑链路,不要动证书。如果所有节点都握手失败,那才是配置层面的问题,按证书链、协议版本、端口逐项排。

改完配置再复测一轮,对着同一批节点看结果有没有变化,别拿改前的南方节点和改后的北方节点比。

什么时候该警惕

证书快到期、链不完整、域名对不上、握手直接失败,这几种都别拖。它们平时不响,等到用户浏览器弹出红色警告,损失已经发生了。

根证书这个概念本身不复杂,复杂的是它在链路里的位置。把它放回客户端那一侧去理解,很多「证书有问题」的结论,其实都能重新判断一遍。