本文系统介绍常见证书文件格式与 SSL 证书文件相关概念,提供格式识别方法、主流 Web 服务器的证书格式选型,以及可直接复用的格式转换命令。
常见证书文件格式
不同服务器对证书格式的要求各不相同,具体可参见主流Web服务器证书格式选型。推荐在阿里云数字证书管理服务购买并签发证书后,根据服务器类型下载对应格式的证书文件,详情可参见下载SSL证书。
文档扩展名 | 内容格式 | 描述 |
| 文本格式 (PEM) | 通用扩展名,可存放证书、私钥、证书链或它们的组合。具体内容需查看文件中的BEGIN/END标记。 |
| 文本格式 (PEM) 或二进制格式 (DER) | 通常用于存放私钥文件。 |
| 文本格式 (PEM) 或二进制格式 (DER) | 通常只包含证书(公钥和身份信息)、不包含私钥。可以是单个服务器证书,也可以是包含中间证书的证书链文件。 |
| 二进制格式 (PKCS#12) | 可以同时包含服务器证书、私钥和证书链,通常带有密码保护。 |
| 二进制格式 (JKS) | Java 平台专有的密钥库(Keystore)格式,用于存储密钥条目(私钥和证书链)和信任条目(CA 证书)。自 Java 9 起,PKCS#12 已成为默认的推荐格式。 |
主流Web服务器证书格式选型
服务器类型 | 推荐格式 | 所需文件 | 说明 |
Nginx, Apache | PEM | 证书文件 ( | 需要分别配置证书和私钥文件。证书文件应为包含服务器证书和所有中间证书的完整证书链。 |
Tomcat, JBoss, WebLogic | PFX/P12 (PKCS#12) | 证书库文件 ( | Java应用服务器推荐使用标准的PKCS#12格式。若仍在使用旧的JKS格式,建议迁移。 |
IIS | PFX | 证书库文件 ( | Windows IIS服务器的标准格式。通过导入一个带密码的 PFX 文件即可完成证书与私钥的部署。 |
IBM WebSphere | KDB | 证书库文件 ( | 使用 IBM 官方提供的 |
对于 Nginx/Apache,如果 CA 提供了独立的中间证书文件,需要将服务器证书和中间证书合并,然后再部署生成的完整证书链文件。通常无需将根CA证书包含在部署的链文件中,仅拼接服务器证书与中间证书即可。
# 在 Linux/macOS 的终端中执行
cat server.crt chain.crt > fullchain.crt
SSL 证书文件相关概念
SSL 证书文件涉及以下四个核心概念:
证书组件:构成 SSL 安全通信的核心要素。
SSL 证书:包含域名、公钥、颁发者和有效期等信息的身份证明。
私钥:与证书中的公钥形成密钥对,用于身份认证和加密通信。私钥必须严格保密。
证书链:从服务器证书到根CA证书的完整信任路径,包含一个或多个中间CA证书。
编码方式:将内容对象序列化为数据流的方式。
PEM (Privacy-Enhanced Mail):文本格式。采用 Base64 编码,并由
-----BEGIN...-----
和-----END...-----
标记包裹。一个 PEM 文件可包含证书、私钥或二者的组合。DER (Distinguished Encoding Rules):二进制格式。ASN.1 的二进制编码表示。PEM 通常是对 DER 数据进行 Base64 编码并添加 BEGIN/END 标记后的文本封装。DER 文件体积比 PEM 更小,但不便于直接用文本编辑器阅读。
容器格式:用于打包一个或多个证书组件的标准。
PFX / P12 (PKCS#12):二进制格式的证书库。它将服务器证书、私钥以及中间证书链打包在一个经过密码保护的加密文件中。这是在服务器(尤其是 Windows IIS)之间迁移证书或为Java应用服务器提供证书时的首选格式,因为它简化了部署流程。
JKS (Java Keystore):Java 专用的证书库格式。虽然仍被一些旧版 Java 应用使用,但业界已推荐使用更通用的 PKCS#12 格式。
文件扩展名:文件的后缀名,如
.pem
,.crt
,.key
,.pfx
。说明文件扩展名仅为一种命名约定,并不可靠。例如,
.crt
文件可能是 PEM 编码,也可能是 DER 编码。必须通过内容来判断其实际格式。
如何识别证书文件格式
部署前,请通过以下方法准确识别证书文件格式,以避免部署失败。
通过文本内容识别 (PEM 格式)
使用文本编辑器打开文件。如果看到以下格式的 ASCII 字符块,则为 PEM 编码格式。否则请使用 OpenSSL 工具识别。
-----BEGIN CERTIFICATE-----
MIIE5zCCA8+gAwIBAgIQN+whYc2BgzAogau0dc3PtzANBgkqh......
-----END CERTIFICATE-----
常见的标记包括:
-----BEGIN CERTIFICATE-----
:表示这是一个证书文件。-----BEGIN PRIVATE KEY-----
或-----BEGIN RSA PRIVATE KEY-----
:表示这是一个私钥文件。-----BEGIN ENCRYPTED PRIVATE KEY-----
:表示这是一个加密的私钥文件。-----BEGIN EC PRIVATE KEY-----
:表示这是一个椭圆曲线(EC, Elliptic Curve)私钥文件。
使用 OpenSSL 工具识别
对于无法通过文本查看的二进制文件,或需要获取详细信息时,可使用 OpenSSL 命令行工具识别。
识别 PEM 格式的证书文件。
文件内容以-----BEGIN CERTIFICATE-----
开头,即为 PEM 编码的证书。# 查看 PEM 证书的详细信息 openssl x509 -in certificate.crt -noout -text
识别 PEM 格式的私钥文件。
文件内容以-----BEGIN PRIVATE KEY-----
、-----BEGIN RSA PRIVATE KEY-----
、-----BEGIN ENCRYPTED PRIVATE KEY-----
、-----BEGIN EC PRIVATE KEY-----
开头,即为 PEM 编码的私钥。# 查看 PEM 私钥的详细信息 openssl pkey -in private.key -noout -text
识别 PFX/P12 证书库。
该格式为二进制格式,包含证书和私钥。# 查看 PFX 文件的内容,会提示输入密码 openssl pkcs12 -in keystore.pfx -info -noout
识别 DER 格式的证书。
DER 是证书的二进制编码格式,文件无法直接用文本编辑器查看。常见于 Java 应用、移动平台以及 Windows 证书存储。
# 查看 DER 证书的详细信息 openssl x509 -in certificate.der -inform der -noout -text
证书格式转换
可以通过以下两种方式进行证书格式转换:
使用数字证书管理服务提供的转换工具:其提供了便捷的证书工具,支持 PEM、PFX、JKS 等格式的快速转换,无需命令行操作。
使用 OpenSSL 命令行工具:OpenSSL 是最通用的证书处理工具,适用于任何操作系统,并能提供高度定制化的转换选项。
使用数字证书管理服务提供的转换工具
阿里云数字证书管理服务提供SSL证书格式转换工具,支持PEM与PFX、PEM与JKS、PEM与PKCS8格式间的转换。具体操作,请参见证书工具。
使用 OpenSSL 命令行工具
将 PEM 转换为 PFX (用于 IIS, Tomcat)
此命令将一个证书文件 (
.crt
)、一个私钥文件 (.key
) 以及一个可选的证书链文件合并为一个受密码保护的 PFX 文件。# 仅包含服务器证书和私钥时执行 openssl pkcs12 -export -out server.pfx -inkey private.key -in server.crt # 包含完整证书链时执行 openssl pkcs12 -export -out server.pfx -inkey private.key -in server.crt -certfile chain.crt
将 PFX 拆分为 PEM (用于 Nginx, Apache)
此命令从一个 PFX 文件中提取出证书(包含证书链)和私钥,生成多个独立的 PEM 文件。
# 1. 提取带密码保护的私钥 openssl pkcs12 -in server.pfx -nocerts -out server.encrypted.key # 2. 提取服务器叶子证书(不含CA链) openssl pkcs12 -in server.pfx -clcerts -nokeys -out server.crt # 3. 提取中间CA证书(注:通常不需要包含根CA证书) openssl pkcs12 -in server.pfx -cacerts -nokeys -out chain.crt # 4.(可选)去除私钥密码保护,便于Nginx/Apache非交互启动 openssl pkey -in server.encrypted.key -out private.key # 5.(可选)拼接完整证书链文件,供Nginx/Apache使用 # 顺序:先服务器证书,再中间证书(若有多个中间证书则按链顺序依次拼接) # 注意:如果chain.crt不存在(PFX中没有中间证书),则跳过此步骤 cat server.crt chain.crt > fullchain.crt
说明最终生成的
private.key
是一个无密码保护的私钥文件,可以直接用于服务器配置。请确保其文件权限得到严格的控制(例如chmod 400 private.key
,仅文件所有者可读)。当存在证书链且拼接完整证书链文件后,部署时参考如下设置:
Nginx :设置
ssl_certificate
为fullchain.crt
文件地址,ssl_certificate_key
为private.key
文件地址。Apache:设置
SSLCertificateFile
为fullchain.crt
文件地址(适用于Apache 2.4.8及以上版本),SSLCertificateKeyFile
为private.key
文件地址。对于2.4.8之前的旧版本Apache,需要将中间证书链单独配置在SSLCertificateChainFile
指令中。
在 DER 和 PEM 之间转换
DER 是 ASN.1 的二进制编码,PEM 是对 DER 的 Base64 封装并附带 BEGIN/END 标记。两者内容等价,仅编码形式不同。
# DER 转 PEM openssl x509 -inform der -in certificate.cer -out certificate.pem # PEM 转 DER openssl x509 -inform pem -in certificate.pem -outform der -out certificate.der
将 JKS 转换为 PFX/P12 (推荐的迁移路径) 如果仍在使用旧的 JKS 证书库,建议使用 Java 的
keytool
工具将其转换为更通用的 PFX/P12 格式。keytool -importkeystore -srckeystore keystore.jks -srcstoretype JKS -destkeystore keystore.p12 -deststoretype PKCS12
说明此命令会将
keystore.jks
中的所有条目迁移到新的keystore.p12
文件中。如果您只想迁移特定的条目,可以附加-srcalias "your_alias"
和-destalias "your_alias"
参数。执行过程中,会提示您输入目标密钥库(PFX/P12)的密码和源密钥库(JKS)的密码。