根据不同服务以及服务的版本,我们需要用到不同的证书和私钥格式,各种格式的证书及私钥遵循的公钥加密标准(Public Key Cryptography Standards, PKCS)和编码方式也各不相同。

常见证书格式

电子证书可以二进制或 Base64 形式存储,常见的文件扩展名有 .cer、.crt、.der 和 .pem。如果把证书和私钥一起存储,则可以使用 PKCS#12(.p12、.pfx)格式。

  • DER:用于二进制 DER 编码的证书,这类证书常见的文件扩展有 .der、.cer、.crt 等。

  • PEM:用于不同类型的 X.509v3 文件,是以 - BEGIN …​ 前缀的 ASCII(Base64)数据,这类证书常见的文件扩展名有 .der、.cer、.crt 等。

  • CERCRT:几乎同义,证书可以被编码为二进制 DER 或 ASCII PEM。

  • PKCS7 文件:也被称为 P7B,通常用于 Java Keystores 和 Microsoft IIS(Windows)。它们是 ASCII 文件,可以包含证书和 CA 证书。

  • PKCS12 文件:也被称为 PFX 文件,通常用于在 Micrsoft IIS(Windows)中导入和导出证书链。

常见 web 服务使用的证书格式:

  • Tomcat 一般使用 Java 提供的密码库。通过 Java 的 Keytool 工具,生成 Java Keystore(JKS)格式的证书文件。

  • Apache、Nginx 等,使用 OpenSSL 提供的密码库,生成 PEM、CRT 等格式的证书文件。

  • Windows Server 中的 Internet Information Services(IIS),一般使用 PFX 格式的证书文件。

证书转换方法

线上工具转换

通过一些证书格式转换的网页操作,例如 SSL 在线工具证书格式转换

命令行转换

根据格式转换的需求安装 OpenSSL、Keytool 工具,使用命令进行配置。

说明

在执行格式转换的命令前,需要通过证书编码方式、常见文件扩展名区分证书格式,比如 DER 编码的证书是二进制格式,而 PEM 编码的证书是文本格式,内容以 -BEGIN…​ 开始。

具体操作如下:

OpenSSL

  • PEM 和 DER 相互转换(特指编码方式,与文件扩展名无关)

    查看 PEM 编码证书:

     openssl x509 -in xxx.crt -text -noout

    查看 DER 编码证书:

    openssl x509 -in xxx.der -inform der -text -noout

    格式转换:

    openssl x509 -in xxx.pem -outform DER -out xxx.der
    
    openssl x509 -in xxx.der -inform DER -outform PEM -out xxx.pem
  • PEM 和 PKCS7 相互转换

    说明

    PKCS7 文件常常是证书链文件,此文件中可包含多个证书。

    格式转换:

    openssl crl2pkcs7 -nocrl -certfile xxx.pem -out xxx.p7b
    
    openssl pkcs7 -print_certs -in xxx.p7b -out xxx.pem
  • PEM 和 PKCS12 转换

    说明

    PKCS12 文件中一般包含了证书和私钥,在格式转换时需要将私钥也添加进去,同时还需要输入一个密码。

    格式转换:

    openssl pkcs12 -export -in xxx.crt -inkey xxx.key -out xxx.pfx
    
    PKCS12-->CRT&KEY
    1、提取证书:
    openssl pkcs12 -in xxx.pfx -nokeys -out SERVERNAME.pem
    2、提取私钥:
    openssl pkcs12 -in xxx.pfx -nocerts -out SERVERNAME.key -nodes

Keytool

说明

Keytool 使用 Java 提供的密码库,使用此命令需先配置 Java环境

  • JKS 和 PKCS12 转换

    说明

    和 PKCS12 一样,JKS 也需要输入密码,同时还需要验证 PKCS12 文件的密码。

    格式转换:

    keytool -importkeystore -srckeystore xxx.pfx -destkeystore xxx.jks -srcstoretype PKCS12 -deststoretype JKS
    
    keytool -importkeystore -srckeystore xxx.jks -destkeystore xxx.pfx -srcstoretype JKS -deststoretype PKCS12

将 cert 证书转换为 pem

在云服务器部署 https 业务时,需要填写 SSL 证书的路径,而这个证书需要是 pem 格式的,例如下图:

crt_2_pem_1

但是从青云控制台生成的证书,下载之后是 crt 格式的,需要将格式进行转换。

#openssl x509 -outform PEM -in server.crt -pubkey -noout > public_key.pem

转换完成后,将 pem 格式的证书添加到 SSL 的证书路径中,如 ssl_certificate 参数后。