低版本android和ios访问https失败主因是nginx未发送完整证书链,须用openssl验证输出至少两段subject(域名证书+中间证书),并确保fullchain.pem严格按序拼接、不含根证书、无空行。

低版本 Android 和 iOS 访问 HTTPS 失败,绝大多数情况不是系统“太老”,而是 Nginx 没把证书链发全——尤其缺中间证书。这些旧系统内置根证书少、不支持自动补全、缓存弱、TLS 协商更严格,对服务端证书链完整性要求反而更高。
先确认是不是证书链问题
别看浏览器图标或截图,直接在服务器上执行:
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 必须是你自己的域名;第二块起必须是中间证书,不能是根证书
- 多级中间证书要按信任路径从近到远排列(如 R3 → E1),不能倒置或跳级(如 R3 → ISRG Root X1)
- 两段之间不能有空行,不能混入私钥、注释、Windows 回车符(\r\n)
排除客户端缓存与时间偏差干扰
低版本移动系统对 SSL 错误缓存更顽固,且时间校验更敏感:
- 安卓设备:进【设置 → 系统 → 日期和时间】,关闭再开启【自动确定日期和时间】,强制同步网络时间
- iOS 设备:【设置 → 通用 → 日期与时间】开启【自动设置】;若仍异常,尝试重启设备
- 清除 WebView 缓存:安卓卸载重装 App 或清空 App 数据;iOS 可尝试 Safari 清除历史记录和网站数据
- 测试时用 curl -v https://your-domain.com 直连,绕过浏览器缓存干扰
验证配置是否真正生效
改完配置后,务必 reload 并立即验证:
- 执行 nginx -t && nginx -s reload,确认无报错
- 重跑 openssl 命令,确保输出中明确出现两段证书,且第二段 subject 显示中间 CA
- 用 SSL Labs 测试页 查看 “Certificate Chain” 是否标绿、“Chain issues” 是否为 None
- 注意:ssl_trusted_certificate 是给 Nginx 做客户端验证用的,对浏览器访问完全无效,设了也没用











