移动端证书不可信主因是nginx未发送中间证书,需用openssl验证输出至少两段subject(域名证书+中间ca),严格拼接fullchain.pem(域名证书在前、中间证书紧随、不含根证书),并配置ssl_certificate指向该文件。

移动端报错“证书不可信”“NET::ERR_CERT_AUTHORITY_INVALID”或“无法验证服务器身份”,大概率不是证书过期或域名不对,而是 Nginx 没把中间证书发给客户端。安卓和 iOS 对证书链完整性更敏感,尤其在干净环境(如新设备、无痕模式、Java/Python 请求)下会直接失败。
先确认是不是证书链真有问题
别依赖浏览器图标或页面提示,直接看服务端实际发送了什么:
- 在 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,确认有且仅有两个(或多个)-----BEGIN CERTIFICATE----- 块
- 第一块必须是你域名的证书(Subject 含你的域名)
- 第二块起必须是中间证书,不能是根证书;多级中间证书需按信任路径从近到远排列(如 R3 → E1)
- 两段之间不能有空行、不能混入私钥、注释、BOM 或 Windows 编码乱码
改对 Nginx 配置并验证生效
配置改完不等于生效,必须交叉验证:
- 确保配置中只有这两行关键修改:
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem; - 删掉或注释掉旧的 ssl_certificate /xxx/old.crt 这类错误配置
- 重载前先测试:nginx -t;重载后立即再跑一次 openssl 命令,确认输出中明确出现两段证书
- 用 SSL Labs 扫描,看 “Certificate Chain” 是否标绿、“Chain issues” 是否为 None
避开常见干扰和误区
很多问题看似修复了,实则被缓存或配置误导:
- 清除安卓 Chrome 的 HSTS 缓存:chrome://net-internals/#hsts → 删除对应域名
- iOS Safari 清除方式:设置 → Safari → 清除历史记录和网站数据
- ssl_trusted_certificate 对浏览器访问完全无效——它只用于 OCSP stapling 或反向代理校验,别指望它补证书链
- 宝塔等面板的“自动补全证书链”功能对 ZeroSSL、Sectigo、DigiCert 等非 Let’s Encrypt 证书大概率失效,必须手动拼接











