绝大多数情况是Nginx未发送完整且顺序正确的证书链,需用openssl s_client检查输出中第一块为域名证书、第二块为中间证书(非根证书),并确保ssl_certificate指向按序拼接的fullchain.pem文件。

手机端浏览器(尤其是 iOS Safari 和部分安卓 Chrome)提示“证书不受信任”,绝大多数情况不是证书本身无效,而是 Nginx 没有把完整的、顺序正确的证书链发给客户端。PC 浏览器有时能自动补全中间证书,但手机系统更严格,必须由服务端一次性提供完整链。
确认证书链是否完整发送
用 OpenSSL 直接检查服务器实际返回的内容:
- 运行命令:openssl s_client -connect your-domain.com:443 -showcerts
- 观察输出中 BEGIN/END CERTIFICATE 块的数量和顺序:第一块必须是你的域名证书,第二块必须是中间证书(Issuer 不是自签名,且其 Subject 应与第一块的 Issuer 匹配)
- 若只看到一块,或第二块是根证书(Issuer == Subject),说明链缺失或顺序错误
正确拼接并配置 fullchain.pem
Nginx 的 ssl_certificate 必须指向一个拼接好的 PEM 文件,不能只放域名证书:
- 把你的域名证书(your-domain.crt)和中间证书(intermediate.crt)按顺序拼接:先域名证书,空一行,再中间证书
- 命令示例:cat your-domain.crt intermediate.crt > fullchain.pem
- 切勿包含根证书(Root CA)——它已预装在手机系统中,加入反而干扰验证
- 配置中写:ssl_certificate /path/to/fullchain.pem;(不是 .crt 单文件)
检查 Nginx 配置与文件权限
常见低级但致命的错误:
- ssl_certificate_key 仍用原始私钥(如 your-domain.key),不要混入证书链文件
- 确认文件权限为 644,Nginx 主进程(通常是 nobody 或 www-data)能读取
- 避免多个 server 块引用不同路径的证书,导致部分子域名仍加载旧链
- 删掉无用的 ssl_trusted_certificate 配置——它不参与客户端证书下发,仅用于 OCSP 内部校验
清理缓存并验证效果
手机端容易缓存失败握手结果,务必彻底验证:
- 重启 Nginx:nginx -t && systemctl reload nginx
- 用无痕模式或换一台未访问过的安卓/iOS 设备测试
- 清除 Chrome 或 WebView 缓存,iOS 还需在「设置 → Safari → 清除历史记录与网站数据」
- 推荐用 SSL Labs 扫描域名,重点看 “Certificate Chain” 是否显示 “OK”,Android 列是否绿色


















