SSL 证书和私钥可以存储为多种文件格式。内容是相同的——区别在于编码和封装方式。大多数困惑来自于需要为特定服务器提供特定格式。
格式对比
| 格式 | 扩展名 | 编码 | 包含内容 | 使用者 |
|---|---|---|---|---|
| PEM | .pem, .crt, .cer, .key | Base64(文本) | 证书、密钥或证书链(每文件一个) | Nginx、Apache、大多数 Linux 服务器 |
| DER | .der, .cer | 二进制 | 单个证书或密钥 | Java、某些 Windows 应用 |
| PFX/PKCS#12 | .pfx, .p12 | 二进制 | 证书 + 密钥 + 证书链合为一个文件 | Windows IIS、Azure、macOS Keychain |
PEM —— 最常见的格式
PEM(Privacy Enhanced Mail)是 Base64 编码的文本。可以用文本编辑器打开:
-----BEGIN CERTIFICATE-----
MIIFYjCCBEqgAwIBAgISA8ht...
(base64 encoded data)
-----END CERTIFICATE-----
PEM 文件可以包含证书、私钥或证书链。文件头告诉你里面是什么:
BEGIN CERTIFICATE—— 一张证书BEGIN PRIVATE KEY—— 一个私钥(或BEGIN RSA PRIVATE KEY/BEGIN EC PRIVATE KEY)BEGIN CERTIFICATE REQUEST—— 一个 CSR
GetHTTPS 输出 PEM 格式 —— privkey.pem、cert.pem、chain.pem、fullchain.pem。
DER —— 二进制编码
DER 是 PEM 以文本编码的相同数据的二进制形式。不是人类可读的。主要用于 Java 应用(keytool)和某些 Windows 组件。
PFX/PKCS#12 —— 打包格式
PFX(Personal Information Exchange)将证书、私钥和证书链打包成一个受密码保护的文件。Windows IIS、Azure App Service 和 macOS Keychain 需要此格式。
格式之间的转换
所有转换使用 OpenSSL:
PEM → PFX
openssl pkcs12 -export \
-out certificate.pfx \
-inkey privkey.pem \
-in cert.pem \
-certfile chain.pem
系统会提示你设置导出密码。
PFX → PEM
# Extract certificate
openssl pkcs12 -in certificate.pfx -clcerts -nokeys -out cert.pem
# Extract private key
openssl pkcs12 -in certificate.pfx -nocerts -nodes -out privkey.pem
# Extract chain
openssl pkcs12 -in certificate.pfx -cacerts -nokeys -out chain.pem
PEM → DER
openssl x509 -in cert.pem -outform DER -out cert.der
DER → PEM
openssl x509 -in cert.der -inform DER -outform PEM -out cert.pem
我需要哪种格式?
| 服务器/平台 | 格式 | 所需文件 |
|---|---|---|
| Nginx | PEM | fullchain.pem + privkey.pem |
| Apache | PEM | cert.pem + chain.pem + privkey.pem |
| IIS (Windows) | PFX | certificate.pfx(从 PEM 转换) |
| Azure App Service | PFX | certificate.pfx |
| AWS (ACM) | PEM | cert.pem + chain.pem + privkey.pem(粘贴到控制台) |
| Java (Tomcat) | JKS 或 PFX | PEM → PFX → JKS 使用 keytool 转换 |
| Node.js | PEM | 在代码中直接读取文件 |
如何识别文件的格式
不确定文件是什么格式?检查:
# If it starts with "-----BEGIN" — it's PEM (base64 text)
head -1 mystery-file.pem
# If it's binary (garbled text) — it's DER or PFX
file mystery-file.cer
# Output like "data" or "certificate" = DER
# Output like "PKCS12" = PFX
# Inspect a PEM certificate
openssl x509 -in cert.pem -noout -text
# Inspect a DER certificate
openssl x509 -in cert.der -inform DER -noout -text
# Inspect a PFX file
openssl pkcs12 -in cert.pfx -info -nokeys
常见的文件扩展名混淆
| 扩展名 | 通常表示 | 也可能是 |
|---|---|---|
.pem | PEM(Base64) | 始终是 PEM |
.crt | PEM 证书 | Windows 上可能是 DER |
.cer | PEM 证书 | Windows 上可能是 DER |
.key | PEM 私钥 | DER(罕见) |
.pfx | PKCS#12 包 | 始终是 PFX |
.p12 | PKCS#12 包 | 始终是 PFX(与 .pfx 相同) |
.der | DER(二进制) | 始终是 DER |
.jks | Java KeyStore | 始终是 JKS |
经验法则: 用文本编辑器打开文件。如果看到 -----BEGIN CERTIFICATE-----,无论扩展名是什么,它都是 PEM 格式。如果看到二进制乱码,它就是 DER 或 PFX。
常见问题
.crt、.cer 和 .pem 有什么区别?
它们都可以是 PEM 格式。扩展名是命名约定,不是格式标识。.crt 和 .cer 通常用于证书文件,.pem 用于任何 PEM 编码的文件。在 Windows 上,.cer 文件有时是 DER 编码的——用文本编辑器打开检查即可。
为什么 GetHTTPS 给我 4 个文件?
为了最大兼容性。GetHTTPS 提供:privkey.pem(私钥)、cert.pem(仅你的证书)、chain.pem(中间 CA 证书)、fullchain.pem(证书 + 证书链合并)。Nginx 需要 fullchain.pem;Apache 需要单独的 cert.pem + chain.pem;IIS 需要 PFX(从 PEM 转换)。
如何为 Windows/IIS 创建 PFX?
使用上面的 OpenSSL PEM → PFX 命令。你需要从 GetHTTPS 获取的 privkey.pem、cert.pem 和 chain.pem。生成的 .pfx 可以导入到 IIS、Azure App Service 或 macOS Keychain。
没有私钥能转换格式吗?
你可以在没有私钥的情况下将证书在 PEM 和 DER 之间转换。但创建 PFX 需要私钥(它将证书和密钥打包在一起)。如果丢失了私钥,你需要生成新的证书。
Let’s Encrypt 使用什么格式?
Let’s Encrypt(通过包括 GetHTTPS 在内的任何 ACME 客户端)输出 PEM 格式。如果你的服务器需要其他格式,使用上面的 OpenSSL 命令进行转换。