第16课:大话证书格式

第16课:大话证书格式

如果我们打开 XCA 软件以及在 Windows 操作系统打开 IE 选择导出证书的时候,其会有很多的格式让我们选择,下面是一些可能经常会碰到的导出格式:

  • PEM(.crt、.key、.cer、.pem、.cert、.csr)
  • DER(.der)
  • PCKS #7(.p7b)
  • PCKS #12(.p12、.pfx 或者 .pcks12)

(1)使用 IE 浏览器进行证书导出的时候:

(2)使用 XCA 进行证书导出的时候:

为什么会有这么多种的格式?这些格式分别代表什么含义呢?这些格式,他们之间可以相互转换吗?下面我们一起进入这个神奇而令人激动的世界。

存储格式的多样化

世界上没有无缘无故的爱,也没有无缘无故的恨。在非对称加密的世界里面,其核心就是私钥和公钥,私钥是我们自己需要严格保存的,公钥是放在 SSL 证书里面的。

而 SSL 证书是可以被 CA 进行签名的,而 CA 可以包含多级的,也就是所谓的证书链,那么证书请求(CSR)被中间的代理 CA 签名以后,如何把代理 CA,以及颁发代理 CA 的代理 CA,直到根 CA 也发送给证书请求者呢,这个就需要有一个特殊的存储格式来进行存储,PCKS #7 格式可以用来解决这个问题。

enter image description here

有的时候,我们只需要单独导出服务器端 SSL 证书,在进行通信的时候,让客户端基于某种规则进行校验服务器端的 SSL 证书,看是否其可信任,反之亦然,PEM、CER、DER 等格式就是其中的一些方式。

有的时候,我们搭建基于 TLS/SSL 协议的服务器的时候,我们需要把私钥和 SSL 证书一起进行配置,这个就牵涉到了如何把私钥和公钥放到一起进行传输的问题。因为里面有了私钥,那么其存储的时候就应该有密码来进行保护,PCKS #12 格式可以用来解决这个问题。

如果把要保护要进行转移或者存储的 SSL 证书以及其私钥比喻成为货品的话,那么这些存储格式就是不同的仓库,有一般的露天仓库来存储一般的不带私钥的 SSL 证书(p7b、cer、der、pem),有的如银行保险柜一般的安全可靠仓库来存储带有需要保护的私钥的仓库(p12 或者 pfx)。

即使是都是露天仓库,其也有不同的构造方式,有的直接不包装就进行存储,比如煤炭,这个有点像 DER 的格式,直接存储二进制格式,有的经过转换包装进行存储,有点像把二氧化碳变成干冰进行存储一样,易于使用,这种格式就好比 CER,其把二进制的证书格式进行了 Basecode64 的编码之后在进行保存。

从上面可知,不同的场景和需求,造就了存储格式的多样化。

常见证书格式的含义

下面具体来看下面每种格式代码的含义和使用方式。

  • PEM(.crt、.key、.cer、.pem、.cert、.csr)
  • DER(.der)
  • PCKS #7(.p7b、.p7c、spc)
  • PCKS #12 (.p12 或者 .pfx)

PEM

PEM(Privacy Enhanced Mail,隐私增强邮件格式),其是 X.509 证书文件最常用的编码模式。以下是维基百科上 PEM 的定义:“PEM 是 IETF 早期提出的使用公钥加密保护电子邮件的建议。尽管 PEM 是 IETF 建议的标准,但它从未广泛部署或使用过。PEM 的完整规范在 RFC 1421 中,但是,X.509 证书上的 PEM 编码思想非常简单:

  • 内容必须以 Base64 进行编码。
  • 必须以“-----BEGIN xxxx-----”和“-----End xxxxx-----”在首尾两端包围 Base64 编码后的内容,其中 xxxx 可以为 CERTIFCATE,也可以为“ENCRYPTED PRIVATE KEY”,还可以为“NEW CERTIFICATE REQUEST”,分别用来表示存储的是包含公钥的 SSL 证书、私钥和证书请求。

所以不管以 PEM 的格式导出的证书,其有多少不同的文件后后缀,比如:.pem、.key、.cer、.cert、crt 其本质都是 PEM 的格式。下面我们打开51TalkDocter_Root_CA.crt证书验证一下,果然是这样的。

-----BEGIN CERTIFICATE-----
MIIDtzCCAp+gAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlTELMAkGA1U
EBhMCY24xEDAOBgNVBAgTB3NoYW5ueGkxDTALBgNVBAcTBHhpYW4xFT
ATBgNVBAoTDDUxdGFsa2RvY3RlcjELMAkGA1UECxMCSVQxHTAbBgNVB
AMTFDUxVGFsa
...
qYUGV54BROxVBWjph9K5bRpldiXrV1euGxndLKeRyesCAfRZG8eIqIf
cCZb62/SN/252Z6qEvArGXZqaqubQLiJ2iWt4tV+YrJl3f4Abha4Hns
Ishf8DbiAitBXJW2rHXFTNRq7Y5OAjQEqP2alGR1ytykP7A==
-----END CERTIFICATE-----

另外一个是私钥的例子:

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDg
MBQGCCqGSIb3DQMHBAgD1kGN4ZslJgSCBMi1xk9jhlPxPc
9g73NQbtqZwI+9X5OhpSg/2ALxlCCjbqvzgSu8gfFZ4yo+
.... 
X0R+meOaudPTBxoSgCCM51poFgaqt4l6VlTN4FRpj+c/Wc
blK948UAda/bWVmZjXfY4Tztah0CuqlAldOQBzu8TwE7WD
H0ga/iLNvWYexG7FHLRiq5hTj0g9mUPEbeTXuPtOkTEb/0
GEs=
-----END ENCRYPTED PRIVATE KEY-----

下面这个是 iis-web-01.csr 的内容

-----BEGIN NEW CERTIFICATE REQUEST-----
MIIEVDCCAzwCAQAwZzELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB1NIQU
5OWEkxDTALBgNVBAcMBFhJQU4xFTATBgNVBAoMDDUxdGFsa2RvY3Rl
cjELMAkGA1
...
UECwwCSVQxEzARBgNVBAMMCmlpcy13ZWItMDEwggEiMA0GCSqGSIb
3DQEBAQUAA4IBDwAELCPuZ3rxHC/aV1Fruv9hdqv4+9eCCHw6tOo
YQk7zrta4v8Xk9rQWyiw/f9OKJkFiD5bj3TpZBY=
-----END NEW CERTIFICATE REQUEST-----

因为 PEM 可以安全地包含在 ASCII 中,甚至包括电子邮件等富文本文档中。这意味着读者可以简单地将 PEM 文件的内容复制并粘贴到其他文档并返回,这就是为什么其选择使用了 Base64 编码的原因。目前几乎所有的 SSL 相关应用程序都支持 PEM 编码的证书文件,“OpenSSL”和“keytool”当然也支持没有问题的 PEM 编码证书文件。

DER(.der)

DER(Distinguished Encoding Rules) 以二进制方式进行存储,为 PEM 格式的前身,将其视为 Base64 编码的 PEM 文件的二进制版本很有用,在 Windows 以外的地方并不常用。导出 DER 格式的证书后,其后缀名还是 CER,但是打开的时候,却是二进制文件。下面就是用文本编辑打开一张 DER 格式的 SSL 证书的样子。

enter image description here

虽然文件结构无法直接预览,但是在 Window 操作系统里面,通过 Windows 系统自带的“Crypto Shell Extensions” 工具还是能打开查看其详细可读信息的。

如果在 OpenSSL 的环境下,也可以通过如下 OpenSSL 命令查看其证书内容。

x509 -in 51talkdocterrootca.cer -inform der -text -noout

PCKS #7

在开始 PCKS #7 和 PCKS 12 的证书格式梳理前,咱们先来看看什么是 PCKS。

PKCS(Public-Key Cryptography Standards) 是由 RSA 实验室与其他安全系统开发商为促进公钥密码的发展而制订的一系列标准。

KCS 目前共发布过 15 个标准,常用的有:

  • PKCS#7 Cryptographic Message Syntax Standard
  • PKCS#12 Personal Information Exchange Syntax Standard

对于 PKCS#7 最常见的后缀为 .p7b、.p7c、spc。p7b 以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。所以当要同时导出多个证书且这多个证书形成一组证书链的时候,此时,就可以用 PKCS#7 格式导出。一般情况请下,当我们把证书请求(CSR)发给第三方的 CA 的时候,第三方 CA 把证书请求签名后,就会以 PKCS#7 的格式导出后,发送给我们,其里面可能就包含的 Root CA 证书,多个中级代理证书。XCA 支持到出为 p7b 格式。在 Window 操作系统下面,可以通过双击 p7b 格式的证书打开查看其详细信息,如下图所示意。

PCKS #12

PKCS#12(Personal Information Exchange Syntax Standard )是一个个人信息交换的标准;PKCS#12 定义了个人身份信息(包括私钥、证书、各种秘密和扩展字段)的格式。PKCS#12 有助于传输证书及对应的私钥,于是用户可以在不同设备间移动他们的个人身份信息。

PKCS#12 常用的后缀有:.p12、.pfx、.pcks12。pfx/p12/pcks12 用于存放个人证书/私钥,他通常包含保护密码,二进制方式。在 Windows 的操作系统上面,一般会把其命名为 pfx,比如我们在<<第10课:IIS 如何配置 HTTPS>> 一文中,配置 IIS 的 HTTPS 的时候,其就支持 pfx 格式的直接导入。

需要说明的是,Java 的 keytool 也支持导出 p12 格式。正是因为其支持导出 p12 格式,所以我们才能把 JKS 里面的私钥导出成 PEM 格式,后一篇文章就是专门唠叨这个事情的,敬请期待。

需要值得一提的是,通过 XCA,可以把 PKCS#12 文件里面所有的证书都导入到 XCA 当中进行管理。

证书格式间的相互转换

江湖纷争,硝烟四起;各大门派之间相互争斗,相互渗透。其实在 SSL 的证书存储的世界里,何尝又不是这样呢?有的时候,我们需要把 DER 格式的证书转换成为 PEM 格式,以支持 Ngnix 的配置;有的时候,我们需要把 p12 格式的证书转换成为 PEM 格式,有的时候,我们需要把 p7b 证书里面的 CA 证书和服务器证书导出来…..

笔者平常最喜欢用的两种工具就是 XCA 和 OpenSSL,然后对其进行转换。

(1)XCA

因为 XCA 不仅仅支持证书的导入,也支持证书的导出,所以平常笔者最喜欢别人给我发一个 p12 或者 pfx 格式的证书了,单击“导入”按钮,私钥和 SSL 证书都有了,然后选择自己喜欢的格式进行导出,比如 p7b、cer、pem 等格式。虽然不需要记命令,但是唯一麻烦点的就是每次使用都要大动干戈,要首先建立或者打开一个 XCA 的 DB,然后选导出路径,鼠标点击次数有点多,而且不能批量化,但是却很容易理解和直白。

(2)使用 OpenSSL

说句良心话,OpenSSL 软件真心强大,其提供了很多很多灵活多样的命令供我们使用,而且其在不同格式之间进行格式转换也非常的方便,下面提供一些例子。

  • PEM 转换成 DER
openssl x509 -in cert.crt -outform der -out cert.der
  • DER 转换成为 PEM
openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
  • 把 PEM 转换成为 P7B
openssl crl2pkcs7 -nocrl -certfile certificate.cer -out certificate.p7b -certfile CACert.cer
  • 转换 PEM 成为 pfx 或者 P12
openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt
  • 转换 p7b 到 PEM
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
  • 转换 p7b 到 P12 或者 PFX
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer

openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -out certificate.pfx -certfile CACert.cer
  • 转换 P12 或者 PFX 到 PEM
openssl pkcs12 -in certificate.pfx -out certificate.cer -nodes

OpenSSL 命令功能强大,适合做批量处理,但是却需要记很多的命令;在实际的工作过程中推荐大家结合使用 OpenSSL 和 XCA,相互取长补短。

总结

在实际的工作当中,笔者发现很多同事和朋友对 SSL 证书的存储格式感到迷茫和无措;不知道什么时候该导出什么格式的存储格式;配置的时候,也不理解什么时候需要私钥,什么时候需要 PEM 格式的证书,所以才有了本篇写作的初衷。当然上面列出的是大家日常工作中比较常见的证书格式,其实远远不止这些,比如 PCKS 本身除了 PCKS#7 和 PCKS #12 之外,还有其他 13 种格式,但是对于一般的引用配置而言,其实掌握本文中所陈述的这些存储格式已经足矣,最后祝大家学习愉快。

上一篇
下一篇
目录