现场是这样的。换了一家 CA 之后,证书在浏览器里正常,部分安卓客户端和监控节点访问时提示证书不受信任,查 CT 日志发现这张证书没有出现在任何公开日志里。

中间走过弯路,把「OCSP Must-Staple 开启但服务器没有装订响应」当成主因,改完现象没变。

这类报错背后常见的原因有几处,逐个排除就行。CA 没有把证书提交到 CT 日志,SCT 数量为零;证书是内部签发后手工导入,绕过了公开日志;中间证书链里混入了旧版交叉证书。

动手时先检查证书里是否带 SCT 扩展

echo | openssl s_client -connect www.example.com:443 2>/dev/null | openssl x509 -noout -text | grep -i 'signed certificate timestamp'

到公开日志里查这张证书的序列号

curl -s 'https://crt.sh/?q=example.com&output=json' | head -c 400

向 CA 申请重新签发并确认 SCT 数量

echo | openssl s_client -connect www.example.com:443 -servername www.example.com 2>/dev/null | openssl x509 -noout -text | grep -c 'Timestamp'

末了关闭 Must-Staple 或补齐 OCSP 装订

ssl_stapling on; ssl_stapling_verify on;

别只看报错消失,验证要多做一步。证书文本里能看到至少两个 SCT,crt.sh 能查到对应记录,客户端不再报不受信任。

容易忽略的是,SCT 是证书透明度的硬要求,内部签发图省事,最后会在客户端兼容性上还回来。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189