证书链不完整:部分手机打不开
发布时间:2025-11-10 11:52       
更新时间:2025-11-10 15:42
先说结论:电脑浏览器正常而手机提示证书不可信,大概率是服务器没有下发完整的证书链,中间证书缺失。
## 为什么不同设备表现不一样
浏览器拿到服务器下发的证书后,要沿着"站点证书、中间证书、根证书"逐级验证。桌面浏览器的根证书库较全,部分浏览器还会通过 AIA(证书签发者信息访问扩展)自动补齐缺失的中间证书;移动端没有这条补救通道,服务器给什么就验证什么,链条断了直接报不可信。所以"电脑正常"掩盖不了服务器配置的问题。
报错文案也有辅助价值:提示"证书不受信任"而非"已过期",指向链问题的概率就更大,两类错误先分开再动手。
## 把中间证书补进部署文件
确认当前下发了几个证书:
openssl s_client -connect www.example.com:443 -servername www.example.com -showcerts 2>/dev/null | grep -c "BEGIN CERTIFICATE"
只返回 1 基本可以断定缺链。补法很简单:签发证书时下载包里除了站点证书,还有一个 intermediate 或 ca-bundle 文件,把两者合并:
cat example.com.crt example.com.ca-bundle > fullchain.crt
Nginx 配置里 ssl_certificate 指向合并后的 fullchain.crt,私钥文件不变,nginx -t 检查后 reload 生效。合并顺序不能颠倒,站点证书在前,中间证书在后;顺序拼反了,Nginx 启动时会报 key values mismatch 之类的错,或者干脆起不来。签发方的下载页一般注明要合并的文件与顺序,照官方说明拼最稳。
## 改完用工具独立验证
验证不要用出过问题的浏览器,换第三方在线证书检测服务,或用前面那条 openssl 命令复查证书数量,返回 2 到 3 个(视是否包含根证书)即为正常。再找一台之前报错的手机清缓存后重试,确认恢复。微信内置浏览器、部分安卓系统对证书链的要求更苛刻,验证时把它们列入测试清单,别只测主流桌面浏览器。
证书部署到位后往往一放几年,中间证书更新时容易再次掉链,把"检测证书链"加进例行巡检清单。每次换签发方或续签都重复这套验证,这类"半残"配置就很难溜进生产环境。