移动端“证书不可信”错误主因是nginx未正确发送中间证书;需用openssl验证输出至少两行证书,确保fullchain.pem含域名证书+中间证书(不含根证书),且nginx ssl_certificate指向该文件。

移动端报错“证书不可信”“NET::ERR_CERT_AUTHORITY_INVALID”,大概率不是证书过期或域名不对,而是 Nginx 没把中间证书一起发出去——安卓和部分 iOS 设备验证更严格,只收到域名证书,就无法向上追溯到系统内置的根证书。
用 OpenSSL 看服务器实际发了什么
别信浏览器图标,直接查 Nginx 当前握手时发送的内容:
- 运行命令:
openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts 2>/dev/null | grep "subject=" - 正常应输出至少两行:
第一行含CN=your-domain.com(你的域名证书)
第二行含中间 CA 名称,如CN=Let's Encrypt R3或CN=DigiCert TLS RSA SHA256 2020 CA1 - 如果只有一行,或第二行是
CN=ISRG Root X1(根证书),说明链缺失、顺序错,或混入了根证书
检查 fullchain.pem 文件是否拼对
Nginx 的 ssl_certificate 必须指向一个已拼好的 PEM 文件,不能是单独的 cert.pem:
- 执行
cat /path/to/fullchain.pem,确认有 ≥2 个BEGIN CERTIFICATE块 - 第一块 Subject 必须是你自己的域名(如
CN=example.com) - 第二块起必须是中间证书,Issuer 要能匹配上一块的 Subject;不能出现根证书(如 ISRG Root X1、DigiCert Global Root G3)
- 两段之间只能有一个空行,不能有私钥、注释、BOM 或 Windows 换行乱码
确认 Nginx 配置真正生效
改完配置 reload 后,别急着开手机测试:
- 重跑上面的
openssl s_client命令,确认输出中已出现两段证书,且第二段明确显示中间 CA 名称 - 用 SSL Labs 测试,看 “Certificate Chain” 是否标绿、“Chain issues” 是否为 None
- 若仍报错,可能是 CDN 缓存或客户端 HSTS 缓存干扰:
安卓 Chrome:访问chrome://net-internals/#hsts→ 删除域名
iOS Safari:设置 → Safari → 清除历史记录和网站数据
避开两个最常踩的坑
ssl_trusted_certificate 不是用来补全服务端证书链的——它只用于客户端证书验证或反向代理校验上游证书,设了对浏览器访问毫无帮助。
宝塔等面板的“自动补全证书链”功能不可靠:对 Let’s Encrypt 有时有效,但对 ZeroSSL、Sectigo、DigiCert 或自签名证书,基本失效,必须手动拼接并验证。











