需将.pem拆为.crt和.key以适配老系统;若.pem仅含单证书块可直接重命名;否则用OpenSSL或awk提取证书与私钥,确保头尾完整。

你需要把 Nginx 或 Let’s Encrypt 生成的 .pem 证书文件拆成标准的 .crt(公钥证书)和 .key(私钥)两个独立文件,才能适配某些老版本 Apache、Tomcat 或硬件负载均衡器对文件后缀的硬性要求。
直接重命名法(最快,但有前提)
如果你的 .pem 文件里 只包含一段 BEGIN CERTIFICATE / END CERTIFICATE 块,没有私钥、没有中间证书、也没有其他杂项内容,就直接改后缀:
把 fullchain.pem 改名为 fullchain.crt;把 privkey.pem 改名为 privkey.key。
这一步操作起来很简单,直接在终端执行:mv fullchain.pem fullchain.crt 和 mv privkey.pem privkey.key 即可。注意:如果原 .pem 文件是 fullchain(含根+中间证书),它仍可作为 .crt 使用;但若需单独部署服务器证书(不含中间链),请用下述 OpenSSL 方法提取。
用 OpenSSL 提取证书(.pem → .crt)
适用于 .pem 文件混装了证书、中间证书甚至私钥的情况,必须精准提取出纯证书部分:
第一步:运行命令提取主证书(仅第一个 BEGIN/END CERTIFICATE 块):openssl x509 -in your-cert.pem -out server.crt
第二步:验证输出是否有效:openssl x509 -in server.crt -text -noout —— 若报错 “unable to load certificate”,说明输入文件不含有效证书块,可能全是私钥或格式损坏。
第三步:如需提取完整证书链(主证书 + 中间证书),且原 .pem 中按顺序排列,可用:sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' your-cert.pem > chain.crt。这个命令靠文本模式匹配,不依赖 OpenSSL 解析,更鲁棒。
用 OpenSSL 提取私钥(.pem → .key)
方法一:提取 RSA 私钥(最常见)openssl rsa -in your-cert.pem -out server.key
方法二:提取通用私钥(兼容 PKCS#8 格式,Java/Tomcat 更友好)openssl pkcs8 -topk8 -inform PEM -in your-cert.pem -out server.key -nocrypt
【必须确认 your-cert.pem 文件中确实含有 BEGIN PRIVATE KEY 或 BEGIN RSA PRIVATE KEY 块】,否则命令会卡住并提示 “unable to load private key”。可先用 grep -A1 -B1 "PRIVATE KEY" your-cert.pem 快速检查。
一键分离完整 PEM(含证书+私钥)为 CRT+KEY
当单个 .pem 文件同时包含证书和私钥(如 Let’s Encrypt 的 cert.pem + privkey.pem 合并版),推荐用以下两行命令一次性拆开:
① 提取证书:awk '/^-----BEGIN CERTIFICATE-----$/,/^-----END CERTIFICATE-----$/' your-combined.pem > server.crt
② 提取私钥:awk '/^-----BEGIN [[:alnum:][:space:]]*PRIVATE KEY-----$/,/^-----END [[:alnum:][:space:]]*PRIVATE KEY-----$/' your-combined.pem > server.key
这两条命令基于行范围匹配,不依赖 OpenSSL,即使证书块之间夹杂空行或注释也能准确定位。执行后检查 server.crt 和 server.key 文件头尾是否完整——缺失 -----END 行会导致后续服务启动失败。











