nginx必须将域名证书与中间证书严格按序拼入同一pem文件供ssl_certificate指向,不可依赖ssl_trusted_certificate补全;验证需用openssl s_client检查输出是否含至少两段证书,苹果设备还需清hsts缓存。

苹果设备(尤其是 iOS 和 macOS)对证书链完整性极为敏感,缺少中间证书时,常表现为“无法验证服务器身份”或“此证书不受信任”,而其他平台可能无异常。问题根源在于 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/your/fullchain.pem,观察 BEGIN/END CERTIFICATE 块数量与顺序
- 第一块必须是你域名的证书(Subject 包含你的域名)
- 第二块起必须是中间证书,不能是根证书;多级中间证书需按信任路径从近到远排列(例如:R3 → ISRG Root X1 是错的,R3 → (不放根)才是对的)
- 两段之间不能有空行,也不能混入私钥或注释
特别关注苹果设备的缓存与 HSTS
即使修复了配置,iOS/macOS 可能因缓存继续报错:
- 清除 Safari 或 Chrome 的 HSTS 缓存:
• iOS:设置 → Safari → 清除历史记录和网站数据
• macOS:Safari → 设置 → 隐私 → 管理网站数据 → 搜索域名并移除
• Chrome(macOS):chrome://net-internals/#hsts → 删除域名 - 重启设备后,用无痕窗口首次访问,避免旧会话干扰
- 若使用企业内网或自建 CA,还需在 iOS “设置 → 通用 → 关于本机 → 证书信任设置”中手动启用对应根证书
宝塔等面板用户的实操提醒
面板“自动补全证书链”功能对 Let’s Encrypt 通常有效,但对 ZeroSSL、Sectigo、DigiCert 或自签名证书大概率失效:
- 进入【网站】→【SSL】→【证书信息】,确认显示“证书链完整”且无红色感叹号
- 不要直接粘贴 cert.pem 到“证书(PEM格式)”框;必须手动合并:
• 先粘贴域名证书内容
• 换行后紧接中间证书(可从 CA 官网下载 chain.pem 或 ca-bundle.crt) - 保存后务必点击【重启 Nginx】,而非仅【重载配置】











