如何把 KEY 和 CRT 文件合并成 PEM
PEM 就是文本拼接:cat certificate.crt private.key > combined.pem。本文讲清合并顺序、是否加入证书链、验证方法与 haproxy 等场景的要求。
一句话回答:PEM 文件本质就是 PEM 格式文本的拼接,用 cat 直接合并:cat server.crt server.key > server.pem。多数场景顺序建议证书在前、私钥在后**;如果还有中间证书(证书链),按"站点证书 → 中间证书 → 私钥"的顺序拼。合并后用 openssl x509 -in server.pem -noout -text 验证。**
合并命令
umask 077 # 新建的组合文件包含私钥
cat server.crt server.key > server.pem
# 有中间证书/证书链时
cat server.crt intermediate.crt server.key > server.pem
Windows 的字节拼接示例(还需按 Windows ACL 限制私钥文件访问):
cmd /c "copy /b server.crt+server.key server.pem"
或者直接用文本编辑器:新建文件,依次粘贴证书全文、私钥全文(各含 BEGIN/END 行)。
顺序的讲究
- HAProxy 可使用包含站点证书、证书链和私钥的 PEM;站点证书须在证书链前,具体加载方式按版本配置,不能概括为所有 PEM 块必须固定顺序
- Nginx 通常分别使用
ssl_certificate/ssl_certificate_key,Apache 通常使用SSLCertificateFile/SSLCertificateKeyFile指定证书和私钥,无须为这些配置特意合并 - 拿不准时:先查目标软件的 crt/certificate 文档,不能用排列顺序代替它对文件格式的要求
验证合并结果
先确认原文件本身就是 PEM;扩展名 .crt/.key 不能证明编码。读取和检查文件不会验证完整信任链。
openssl x509 -in server.pem -text -noout
openssl pkey -in server.pem -check -noout
openssl x509 -in server.pem -pubkey -noout -out cert-public.pem
openssl pkey -in server.pem -pubout -out key-public.pem
openssl pkey -pubin -in cert-public.pem -outform DER -out cert-public.der
openssl pkey -pubin -in key-public.pem -outform DER -out key-public.der
openssl dgst -sha256 cert-public.der key-public.der
仅在所有命令成功且两个公钥摘要一致时判断密钥配套。相比 RSA modulus + MD5,该方法也支持 EC 等常见密钥;服务加载前还须检查链、域名和有效期。
检查文件内容
合并后打开看一眼,结构应该是:
-----BEGIN CERTIFICATE----- ← 站点证书
...
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY----- ← 私钥(或 RSA PRIVATE KEY)
...
-----END PRIVATE KEY-----
每个块的 BEGIN/END 行必须完整,必须确保每个 END 与下一个 BEGIN 各自独占一行,普通空行通常可接受。
常见问题(FAQ)
Q:什么时候才需要合并 PEM?
A:看软件要求:HAProxy、部分负载均衡器、某些云平台的证书上传要求"证书+私钥合一"。Nginx/Apache 分开配置即可,不需要合并。
Q:合并后私钥安全吗?
A:合并文件包含私钥,等同私钥文件管理:chmod 600 server.pem、属主为受控服务账户或管理员、不进 Git、不随镜像分发。
Q:cat 合并后软件报错 PEM 格式错误?
A:检查原文件结尾是否有换行——CRT 文件末尾没有换行时,END 行和下一个 BEGIN 行会粘在一起。cat 前确保每个文件以换行结尾,或粘贴时手工补空行。
核查依据
本文依据官方文档核对,示例未在实际业务环境运行;上线前请按部署版本、权限与数据范围验证。