最可靠的方式是在 nginx 服务器本地运行 openssl 命令验证证书链完整性:用 openssl s_client -connect domain.com:443 -showcerts 查看实际返回的证书块数量与顺序,确保首块为域名证书、后续为中间证书、不含根证书或私钥,且 openssl verify 返回 ok 并检查 notafter 有效期。

最可靠的方式是在 Nginx 服务器本地运行 OpenSSL 命令,直接观察它实际发给客户端的证书内容——因为浏览器或在线工具看到的,可能被缓存、代理或中间设备干扰,而安卓、微信小程序、Python requests 等严格校验环境,只认 Nginx 当前真实输出的链。
用 s_client 查看 Nginx 实际返回的证书序列
执行这条命令(替换 your-domain.com 为实际域名):
openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts 2>/dev/null重点看输出中 -----BEGIN CERTIFICATE----- 出现几次:
- 只出现 1 次 → Nginx 仅发送了域名证书,中间证书缺失,链不完整
- 出现 2 次或以上 → 第一块是你自己的证书(Subject 含你的域名),后续是中间证书(如 Let’s Encrypt R3 或阿里云 Intermediate CA)
- 若第一块不是你的域名证书,或中间证书排在前面 → 属于顺序错误,安卓和 curl 会直接拒绝
- 末尾出现根证书(如 ISRG Root X1、GlobalSign Root R1)→ 多余,应剔除
检查 ssl_certificate 文件内容是否合规
Nginx 的 ssl_certificate 指向的 PEM 文件必须满足三项硬性要求:
- 开头是你的域名证书(含 CN=your-domain.com)
- 紧接着是且仅是中间证书(同样以 -----BEGIN CERTIFICATE----- 开头,不能是私钥或根证书)
- 两段之间不能有空行,不能混入 -----BEGIN PRIVATE KEY----- 或其他非证书内容
可用 cat 命令快速确认结构:
用 verify 命令验证链是否能回溯到系统可信根
即使 Nginx 发出了多段证书,如果中间证书不被操作系统信任,依然会失败。运行:
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt /etc/nginx/ssl/fullchain.pem返回 OK 才表示整条链可被系统验证;若报 unable to get issuer certificate,常见原因有:
- fullchain.pem 缺少中间证书
- 中间证书顺序颠倒
- 系统 ca-certificates 包未更新(尤其 Debian/Ubuntu 需运行 sudo update-ca-certificates)
顺带检查证书有效期(常被忽略但同样关键)
Nginx 启动时不会检查过期时间,需手动确认:
openssl x509 -in /etc/nginx/ssl/fullchain.pem -noout -dates重点关注 notAfter 字段。建议在到期前 15 天安排续签,避免服务中断。











