安卓HTTPS证书不可信主因是Nginx未发送完整证书链,解决核心是拼接域名证书与中间证书为fullchain.pem并指向它,再验证链完整性、清除安卓HSTS及浏览器缓存。

安卓设备访问 HTTPS 网站时提示“证书不可信”或“NET::ERR_CERT_AUTHORITY_INVALID”,大概率不是证书本身无效,而是 Nginx 没有把中间证书一并发送给客户端——安卓对证书链完整性要求严格,缺一级都不行。解决核心就一条:让 ssl_certificate 指向一个含正确顺序证书链的文件,并通过工具验证是否生效。
用在线工具快速定位链问题
别先改配置,先确认问题是否存在:
- 打开 SSL Labs SSL Test,输入你的域名,等待扫描完成
- 重点看 “Certificate Chain” 一栏:若显示 “Chain issues: Incomplete” 或 “Extra certs sent”,就是链不完整或顺序错
- 再看 “Trust” 部分:安卓(Android)列是否标红?标红即表示该设备无法建立信任链
- 同理可用 Decoder.link SSL Checker 或 GeoCerts SSL Checker 快速比对
手动拼接 fullchain.pem 的标准操作
很多 CA 提供的压缩包里有多个证书文件,但 Nginx 只认一个合并后的 PEM 文件:
- 确保你手上有两个关键文件:your-domain.crt(你的域名证书)和 ca-bundle.crt 或 intermediate.crt(中间证书)
- 执行拼接命令(Linux/macOS):
cat your-domain.crt intermediate.crt > fullchain.pem - 注意:两段证书之间必须空一行;不能包含根证书(Root CA);不能有 BOM、隐藏字符或多余空格
- 验证拼接结果:
grep -c "BEGIN CERTIFICATE" fullchain.pem 应返回 ≥2
Nginx 配置中必须改对的两处
只改证书文件不够,配置也得匹配链的用途:
- ssl_certificate 必须指向你刚生成的 fullchain.pem(不是单独的 your-domain.crt)
- ssl_certificate_key 仍用原始私钥文件(如 your-domain.key),保持不变
- 删掉或注释掉错误写法:
ssl_certificate /path/to/your-domain.crt; ❌
ssl_certificate /path/to/fullchain.pem; ✅ - ssl_trusted_certificate 不是补链用的,它只用于 OCSP stapling 内部验证,即使配置了也不影响客户端收到的证书链
验证与清理缓存的关键动作
改完不验证=白改,安卓尤其容易缓存旧握手结果:
- 重载 Nginx:
nginx -t && systemctl reload nginx - 本地终端验证链顺序:
openssl s_client -connect your-domain.com:443 -showcerts 2>/dev/null | grep "subject\|issuer"
第一段 subject 应含你的域名,第二段 issuer 应与第一段 subject 匹配 - 安卓端测试前务必:
– 清除 Chrome 缓存 + 进入chrome://net-internals/#hsts删除该域名 HSTS 记录
– 或直接换用 Firefox、Edge 无痕窗口,或重启手机网络











