站点换成 Let's Encrypt 证书后,新系统访问正常,一批 Android 7 的旧手机打开就提示证书不受信任,检测工具显示根证书是 ISRG Root X1 自签名。
一开始怀疑是「服务端只发了叶子证书,中间证书和交叉链都没配」,查了一圈,方向不对。
原因不止一个,得分开看。2021 年之后签发的证书默认不再带 DST Root CA X3 的交叉签名。也可能是旧安卓系统只信任 DST Root CA X3,不认 ISRG Root X1。
还有一种情况,证书链顺序不对,部分客户端构建链时直接失败。
动手时先确认服务端下发的完整证书链
openssl s_client -connect demo.lu0.cn:443 -showcerts </dev/null | grep -E 's:|i:'
下载带交叉签名的完整链
curl -sO https://letsencrypt.org/certs/isrg-root-x1-cross-signed.pem
再往下把交叉证书拼进 fullchain 再重载
cat fullchain.pem isrg-root-x1-cross-signed.pem > chain_new.pem
末了用旧版客户端模拟验证
openssl s_client -connect demo.lu0.cn:443 -CAfile old-ca.pem </dev/null
改完先别撤,确认这几项。openssl 输出里能看到叶子证书、中间证书和交叉签名的根,Android 7 设备打开站点不再提示证书错误。
容易忽略的是,交叉签名证书有有效期,到期前要复查;这类兼容问题只影响老设备,是否保留取决于站点的用户构成。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
