常见SSL证书有哪些格式?

本文系统介绍常见证书文件格式与 SSL 证书文件相关概念,提供格式识别方法、主流 Web 服务器的证书格式选型,以及可直接复用的格式转换命令。

常见证书文件格式

不同服务器对证书格式的要求各不相同,具体可参见主流Web服务器证书格式选型。推荐在阿里云数字证书管理服务购买并签发证书后,根据服务器类型下载对应格式的证书文件,详情可参见下载SSL证书

文档扩展名

内容格式

描述

.pem

文本格式 (PEM)

通用扩展名,可存放证书、私钥、证书链或它们的组合。具体内容需查看文件中的BEGIN/END标记。

.key

文本格式 (PEM) 或二进制格式 (DER)

通常用于存放私钥文件。

.crt.cer

文本格式 (PEM) 或二进制格式 (DER)

通常只包含证书(公钥和身份信息)、不包含私钥。可以是单个服务器证书,也可以是包含中间证书的证书链文件。

.pfx, .p12

二进制格式 (PKCS#12)

可以同时包含服务器证书、私钥和证书链,通常带有密码保护。.pfxWindows中更常见,.p12是标准扩展名。

.jks

二进制格式 (JKS)

Java 平台专有的密钥库(Keystore)格式,用于存储密钥条目(私钥和证书链)和信任条目(CA 证书)。自 Java 9 起,PKCS#12 已成为默认的推荐格式。

主流Web服务器证书格式选型

服务器类型

推荐格式

所需文件

说明

Nginx, Apache

PEM

证书文件 (.pem/.crt)
私钥文件 (.key)

需要分别配置证书和私钥文件。证书文件应为包含服务器证书和所有中间证书的完整证书链。

Tomcat, JBoss, WebLogic

PFX/P12 (PKCS#12)

证书库文件 (.pfx/.p12)

Java应用服务器推荐使用标准的PKCS#12格式。若仍在使用旧的JKS格式,建议迁移。

IIS

PFX

证书库文件 (.pfx)

Windows IIS服务器的标准格式。通过导入一个带密码的 PFX 文件即可完成证书与私钥的部署。

IBM WebSphere

KDB

证书库文件 (.kdb)

使用 IBM 官方提供的 iKeyman 工具进行管理的专用格式。

对于 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证书格式转换工具,支持PEMPFX、PEMJKS、PEMPKCS8格式间的转换。具体操作,请参见证书工具

使用 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_certificatefullchain.crt文件地址,ssl_certificate_keyprivate.key文件地址。

    • Apache:设置 SSLCertificateFilefullchain.crt 文件地址(适用于Apache 2.4.8及以上版本),SSLCertificateKeyFileprivate.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)的密码。