openssl s_client -connect www.example.com:443 -showcerts </dev/null cat server.crt intermediate.crt > fullchain.pem openssl verify -CAfile root.crt -untrusted intermediate.crt server.crt
桌面浏览器正常,Android 7 和部分小程序提示证书无效,openssl verify 报 error 20 unable to get local issuer certificate。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:服务器只发了站点证书,没有带中间 CA,客户端本地缺这张中间证书就拼不出完整链。桌面浏览器会自动下载补全,移动端不一定。
「证书链校验失败」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
处理上按这个顺序:用 openssl s_client 看服务端实际发了几张证书;把站点证书和中间证书按顺序拼成 fullchain.pem;ssl_certificate 指向 fullchain 私钥仍单独配;再用 verify 和手机各验一次。
确认没问题再收工,s_client 输出两张以上证书 verify 返回 OK 安卓设备不再提示证书无效。
