所有 SSL 文章 SSL 与证书

SSL 证书格式:PEM、PFX、DER 详解

SSL 证书和私钥可以存储为多种文件格式。内容是相同的——区别在于编码和封装方式。大多数困惑来自于需要为特定服务器提供特定格式。

格式对比

格式扩展名编码包含内容使用者
PEM.pem, .crt, .cer, .keyBase64(文本)证书、密钥或证书链(每文件一个)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.pemcert.pemchain.pemfullchain.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

我需要哪种格式?

服务器/平台格式所需文件
NginxPEMfullchain.pem + privkey.pem
ApachePEMcert.pem + chain.pem + privkey.pem
IIS (Windows)PFXcertificate.pfx(从 PEM 转换)
Azure App ServicePFXcertificate.pfx
AWS (ACM)PEMcert.pem + chain.pem + privkey.pem(粘贴到控制台)
Java (Tomcat)JKS 或 PFXPEM → PFX → JKS 使用 keytool 转换
Node.jsPEM在代码中直接读取文件

如何识别文件的格式

不确定文件是什么格式?检查:

# 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

常见的文件扩展名混淆

扩展名通常表示也可能是
.pemPEM(Base64)始终是 PEM
.crtPEM 证书Windows 上可能是 DER
.cerPEM 证书Windows 上可能是 DER
.keyPEM 私钥DER(罕见)
.pfxPKCS#12 包始终是 PFX
.p12PKCS#12 包始终是 PFX(与 .pfx 相同)
.derDER(二进制)始终是 DER
.jksJava 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.pemApache 需要单独的 cert.pem + chain.pemIIS 需要 PFX(从 PEM 转换)。

如何为 Windows/IIS 创建 PFX?

使用上面的 OpenSSL PEM → PFX 命令。你需要从 GetHTTPS 获取的 privkey.pemcert.pemchain.pem。生成的 .pfx 可以导入到 IIS、Azure App Service 或 macOS Keychain。

没有私钥能转换格式吗?

你可以在没有私钥的情况下将证书在 PEM 和 DER 之间转换。但创建 PFX 需要私钥(它将证书和密钥打包在一起)。如果丢失了私钥,你需要生成新的证书。

Let’s Encrypt 使用什么格式?

Let’s Encrypt(通过包括 GetHTTPS 在内的任何 ACME 客户端)输出 PEM 格式。如果你的服务器需要其他格式,使用上面的 OpenSSL 命令进行转换。

相关文章

部署 2026-05-08
如何在 Nginx 上安装 SSL 证书
在 Nginx 上安装 SSL 证书的分步指南。涵盖文件上传、完整 server 块配置、TLS 最佳实践、HTTP/2、HSTS、重定向设置、测试以及 6 个常见错误的排查方法。
部署 2026-05-08
如何在 Apache 上安装 SSL 证书
使用 mod_ssl 在 Apache 上安装 SSL 证书的分步指南。涵盖文件上传、VirtualHost 配置、TLS 最佳实践、HSTS、HTTP 重定向以及 5 个常见错误的排查方法。
SSL 与证书 2026-05-07
什么是 CSR(证书签名请求)?
CSR 是发送给证书颁发机构以申请 SSL 证书的消息。了解 CSR 包含什么、如何生成,以及为什么 GetHTTPS 会自动处理它。
在浏览器中获取免费 SSL 证书
无需安装,无需账号。私钥始终留在你的设备上。
获取证书