安卓报错net::err_cert_authority_invalid多因nginx未发送中间证书。排查三步:确认现象(openssl命令查输出是否含域名证与中间证)、验证fullchain.pem是否正确拼接(两段证书、不含根证、无空行)、核对nginx配置ssl_certificate是否指向该文件并重载。

移动端报错,尤其是安卓设备提示 NET::ERR_CERT_AUTHORITY_INVALID 或连接失败,十有八九是 Nginx 没把中间证书发给客户端——不是证书没装,而是链断了。排查核心就三步:确认现象、验证链是否真缺、修对文件再重载。
先快速确认是不是中间证书问题
别猜,用命令直接看 Nginx 实际发了什么:
- 在服务器上执行:
openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts 2>/dev/null | grep "subject=" - 正常应输出至少两行:
• 一行含CN=your-domain.com(你的域名证书)
• 一行含CN=Let's Encrypt R3或CN=DigiCert SHA2 Secure Server CA(中间证书) - 如果只看到一行,或者第二行是根证书(如
CN=ISRG Root X1),说明中间证书缺失或顺序/内容不对 - 安卓用户可配合访问
chrome://net-internals/#hsts清除 HSTS 缓存,再用无痕模式重试,避免缓存干扰判断
检查 fullchain.pem 文件是否拼对
Nginx 的 ssl_certificate 必须指向一个已拼好的 PEM 文件,且顺序和格式不能出错:
- 文件必须包含且仅包含两段(或多段)证书:
• 第一段:你的域名证书(如example.com.crt)
• 紧接着:中间证书(如intermediate.crt;若有多级,按信任路径从近到远追加) - 绝对不要包含根证书(如 ISRG Root X1、DigiCert Global Root)——它已内置在系统里,加了反而可能触发兼容问题
- 两段之间不能有空行,每段以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾 - 验证拼接结果:
grep -c "BEGIN CERTIFICATE" /path/to/fullchain.pem应返回 ≥2
核对 Nginx 配置是否真正用了拼接文件
常见错误是配置写了 fullchain.pem,但实际路径写错,或旧配置没删干净:
- 确认配置中
ssl_certificate指向的是你刚拼好的fullchain.pem,不是单独的example.com.crt - 确认
ssl_certificate_key指向的是原始私钥(如privkey.pem),保持不变 - 删掉或注释掉所有其他
ssl_certificate行,避免冲突 - 执行
nginx -t测试语法,再systemctl reload nginx生效 - 宝塔等面板用户注意:“自动补全证书链”对 Let’s Encrypt 通常有效,但对 ZeroSSL、BuyPass、自签名证书大概率失效,务必手动
cat /www/wwwroot/xxx/fullchain.pem查看真实内容
特别提醒:ssl_trusted_certificate 不是用来修这个的
这个指令常被误用,但它完全不参与服务端证书下发:
- 它只用于 Nginx 自身用途:校验 OCSP 响应签名,或启用双向 TLS(
ssl_verify_client on)时验证客户端证书 - 无论你把它设成什么,只要
ssl_certificate文件里没中间证书,浏览器和安卓就收不到完整链,报错不会消失 - 如果你启用了 OCSP stapling,可以顺便把
ssl_trusted_certificate设为和fullchain.pem相同的文件,但这属于锦上添花,不是修复关键











