安卓SSL连接错误主因是证书链顺序错误,需严格按“域名证书→中间证书”排序且不含根证书,用openssl验证输出顺序,清除客户端缓存并重载Nginx配置。

移动端报错,尤其是安卓设备提示“证书不受信任”“SSL连接失败”或“NET::ERR_CERT_AUTHORITY_INVALID”,十有八九是 Nginx 发送的证书链顺序错了——不是没配证书,而是发出去的顺序不满足客户端校验逻辑。
用 openssl 直接看服务器实际发了什么
别信浏览器图标或页面提示,运行这行命令,模拟真实客户端视角:
openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts 2>/dev/null
重点观察输出里 BEGIN CERTIFICATE 块的排列:
- 第一块 Subject 必须含你的域名(如
CN=your-domain.com) - 第二块 Issuer 要和第一块的 Subject 完全匹配,且自身 Subject 是中间 CA 名称(如
CN=Let's Encrypt R3) - 不能出现第三块是自签名证书(Issuer == Subject),比如
CN=ISRG Root X1—— 根证书不该由服务端发送 - 如果只有一块,或第二块是根证书,说明链缺失或顺序颠倒
检查 fullchain.pem 文件内容是否拼对
Nginx 的 ssl_certificate 必须指向一个严格按序拼接的 PEM 文件。执行:
cat /path/to/fullchain.pem | grep -E "^-----BEGIN CERTIFICATE-----|^Subject:"
确认:
- 开头第一段是你的域名证书(Subject 含域名)
- 紧接着是中间证书(Subject 是中间 CA,Issuer 指向上一段)
- 没有空行、没有私钥、没有注释、没有 Windows 换行符
- 绝对不要包含根证书(如 ISRG Root X1、DigiCert Global Root G3)
正确拼法:cat cert.pem intermediate.pem > fullchain.pem;错误拼法:cat intermediate.pem cert.pem 或 cat cert.pem intermediate.pem root.crt。
核对 Nginx 配置与生效状态
即使文件对了,配置引用错或没生效也会白忙:
- 确认
ssl_certificate指向的是fullchain.pem,不是cert.pem或bundle.crt -
ssl_certificate_key必须单独指向私钥文件(权限建议 600) - 改完后执行 nginx -t && systemctl reload nginx,别只 restart
- 重跑 openssl 命令,确认输出已更新——旧结果可能是缓存或未 reload 导致
绕过缓存干扰,交叉验证
安卓、iOS、Chrome 都可能缓存旧握手结果,导致判断失真:
- 安卓:用 Chrome 无痕模式 + 清除 WebView 数据(设置 → 应用 → Android System WebView → 存储 → 清除数据)
- iOS:设置 → Safari → 清除历史记录与网站数据;或进
chrome://net-internals/#hsts删除对应域名 - 更可靠方式:用 SSL Labs(ssllabs.com)测试,看 “Certificate Chain” 是否标绿、“Chain issues” 是否为 None











