Nginx仅原生支持PEM格式,所谓“转换”实为验证内容合规性、拆分私钥与证书、拼接完整证书链(服务器证书在前、中间证书在后)、确保文件为纯文本PEM编码且私钥权限为600。
Nginx 本身只支持 PEM 格式,所以“从 PEM 转为 Nginx 支持的格式”这个说法其实是个误区——PEM 就是 Nginx 唯一原生支持的证书格式。你不需要、也不能把 PEM “转换”成另一种 Nginx 可用的格式;真正要做的,是确认 PEM 文件内容合规、结构正确、权限合理,并按需拆分或拼接。
别被后缀名迷惑:.pem、.crt、.cert 都可能是 PEM 编码,也可能不是。关键看内容:
head -n 2 your-file.pem 查看开头——必须是 -----BEGIN CERTIFICATE-----(证书)或 -----BEGIN PRIVATE KEY-----(私钥)file your-file.pem 检查类型——应返回类似 ASCII text 或 PEM certificate
openssl x509 -in your-file.pem -text -noout 验证是否为有效证书;若报错,说明它可能混了私钥、是 DER 格式,或已损坏拿到一个 PEM 文件,常需以下处理才能用于 Nginx:
awk 提取第一个 -----BEGIN CERTIFICATE----- 到对应 -----END CERTIFICATE----- 块,保存为 fullchain.pem;再提取 -----BEGIN PRIVATE KEY----- 块,另存为 privkey.key
cat domain.crt intermediate.crt > fullchain.pem,顺序不能错——服务器证书在前,中间证书在后fullchain.pem(证书+中间链)和 privkey.pem,无需任何转换很多操作看似在“转换”,实则多余甚至有害:
openssl x509 -in cert.pem -out cert.crt:只是复制,可能破坏换行或编码,毫无必要.pem 文件简单重命名为 .crt:可以,但不解决实质问题;若原文件内容不对,改名也没用ssl_certificate 使用:Nginx 会加载失败,报错如 SSL_CTX_use_certificate_chain_file failed
即使内容完全正确,Nginx 仍可能因权限或路径报错:
600(仅属主可读写):chmod 600 privkey.key
nginx.conf 中要用绝对路径,或确保相对路径基于 Nginx 启动工作目录有效nginx -V 2>&1 | grep http_ssl_module,缺失需重新编译