直接检查PEM文件编码和文本结构是定位证书链解析失败最快方式;需确认纯ASCII、无BOM/CRLF/空格、首行为标准BEGIN行、块间无空行、仅含合法证书块且顺序正确,最后用openssl和curl实测验证。

直接检查 PEM 文件的编码和文本结构,是定位证书链解析失败最快的方式。Nginx 对文件格式极其敏感——哪怕开头多一个空格、换行是 Windows 风格(CRLF)、或带 UTF-8 BOM 头,都会导致 PEM_read_bio 类错误,甚至静默降级为 HTTP。
确认文件是否为纯 ASCII 文本且无隐藏字符
证书和私钥必须是标准 ASCII 文本,不能含 BOM 或不可见控制符:
- 运行
file your_cert.pem:正确输出应为ASCII text;若显示UTF-8 Unicode (with BOM) text,说明被记事本等工具污染,需用 VS Code 或 vim 保存为“UTF-8 无 BOM”格式 - 执行
cat -A your_cert.pem:若看到^M,即 CRLF 换行符,说明是 Windows 换行,用dos2unix your_cert.pem修复 - 运行
head -n 5 your_cert.pem:首行必须严格为-----BEGIN CERTIFICATE-----(前后各两个短横,大小写一致,无空格、无缩进)
检查证书块之间是否含多余空行或非法内容
PEM 文件中证书块之间不能有空行,也不能夹杂注释、私钥、乱码:
- 用
grep -n "^$" fullchain.pem查找空行;若有输出,说明存在多余空行,需手动删除或用awk 'NF' fullchain.pem > clean.pem清理 - 执行
xxd fullchain.pem | head -n 1:若开头三字节为ef bb bf,就是 BOM,可用sed -i '1s/^\xEF\xBB\xBF//' fullchain.pem删除 - 运行
openssl x509 -in fullchain.pem -noout -text 2>/dev/null || echo "解析失败":报错即说明结构异常(如缺头尾、混入私钥、有乱码)
验证拼接后的 fullchain.pem 是否结构纯净
即使文件能打开,也需确认其仅由合法 PEM 块构成、顺序合规、无干扰内容:
- 用
grep -E "^(-----BEGIN|-----END)" fullchain.pem | wc -l统计证书块数量;结果应为偶数(每块证书含 BEGIN 和 END 各一行) - 执行
head -n 5 fullchain.pem和tail -n 5 fullchain.pem:首尾必须分别是标准 PEM 头与尾,中间不能出现-----BEGIN RSA PRIVATE KEY-----等私钥标识 - 推荐重生成:用
cat domain.crt intermediate.crt > fullchain.pem直接拼接,避开编辑器介入,避免格式污染
快速交叉验证是否修复成功
改完后别只信语法检查,要实测 Nginx 是否真正加载并发送了完整链:
- 重启前先执行
nginx -t,确保配置无语法错误 - 重载后运行
openssl s_client -connect yourdomain.com:443 -showcerts 2>/dev/null | grep "BEGIN CERTIFICATE":应至少输出两行,第一行为域名证书,第二行为中间 CA - 用
curl -vI https://yourdomain.com 2>&1 | grep "subject:"查看实际生效证书的 CN 和有效期,确认不是旧证书或 fallback 到 HTTP


















