最可靠方式是用openssl s_client在nginx本地实测证书链:只出现1次begin certificate表示链不完整,2次及以上说明含域名证书和中间证书;需确认ssl_certificate文件中域名证书在前、中间证书紧随其后、无空行或私钥;在线工具仅作辅助,最终以s_client结果为准。

直接用 OpenSSL 命令就能验证证书链是否完整、格式是否正确,不用等浏览器报错才去排查。
检查证书链完整性(关键一步)
把你的站点证书和中间证书合并后的文件(比如 fullchain.pem)用 OpenSSL 查看签发关系:
- 运行:
openssl x509 -in /etc/nginx/ssl/fullchain.pem -text -noout | grep 'Issuer\|Subject' - 正常应看到两组 Issuer→Subject 对应关系:第一段是你的域名证书(Subject=你的域名,Issuer=中间 CA),第二段是中间证书(Subject=中间 CA,Issuer=根 CA)
- 如果只有一组,说明中间证书没包含进去;如果出现三组,可能误加了根证书——iOS Safari 会因此报 CERT_HAS_EXPIRED
确认私钥与证书匹配
证书和私钥不配对会导致 Nginx 启动失败或 TLS 握手中断:
- 提取证书的公钥:
openssl x509 -in /etc/nginx/ssl/fullchain.pem -pubkey -noout > pub.pem - 提取私钥的公钥:
openssl rsa -in /etc/nginx/ssl/private/domain.key -pubout > priv_pub.pem - 对比两者:
diff pub.pem priv_pub.pem,无输出即匹配
验证 PEM 文件编码与内容纯净度
Nginx 对文件格式很敏感,BOM、空行、多余字符都会导致 unknown directive “ssl_certificate”:
- 检查是否有 UTF-8 BOM:
head -n1 /etc/nginx/ssl/fullchain.pem | hexdump -C | head -1,开头不是ef bb bf才安全 - 确认只含 PEM 块:
grep -E "^(-----BEGIN|-----END)" /etc/nginx/ssl/fullchain.pem | wc -l,结果应为偶数(每张证书含 BEGIN/END 各一行) - 删掉所有空行和注释:
sed '/^$/d;/^#/d' fullchain.pem > clean.pem
模拟 Nginx 加载行为做预检
在重载配置前,快速验证 Nginx 能否顺利读取证书:
- 临时写一个最小 server 块,只启用 ssl_certificate 和 ssl_certificate_key
- 执行:
sudo nginx -t -c /path/to/test.conf,它会实际尝试加载证书并校验格式 - 若报错如 SSL_CTX_use_PrivateKey_file failed 或 unable to load certificate,问题就定位在文件本身











