“PEM”格式的东西没有真正的标准。有一个名为“隐私增强型电子邮件”的提议标准,“PEM”的首字母缩写词就是从该标准中派生出来的;然而,该标准从未在其竞争对手(PGP 和 S/MIME)中获得吸引力,也没有人实施它。
OpenSSL采用了 PEM 并通过额外的功能和标头“增强”了 PEM 格式,而没有任何实际的规范或文档值得这个名字,所以现在,“PEM”真正意味着“OpenSSL 产生和可以解析的任何东西”。其他供应商紧随其后,例如 Microsoft,其软件可以解码 PEM 编码的证书。
PEM(Base64-encoded data, with a '-----BEGIN XXX-----' header and对应的'-----END XXX-----' trail)的原理已被用于其他事物; PGP 称之为“ASCII 盔甲”。这种做事方式的重点是能够在一系列文本数据中定位感兴趣的数据,而不管在传输时对该文本施加的各种折磨(例如,作为电子邮件发送、复制和粘贴、包含在Word 文档,打印和扫描...)。这一点很重要:这意味着 PEM 的全部意义在于能够将证书随意存储在一起,而无需遵循特定的精确标准。从这个意义上说,“PEM 捆绑包”的标准是自相矛盾的:“PEM 捆绑包”
称其为“事实上的标准”并没有错。
当你想编码和发送证书时,实际上有两种以上的方法;可能性包括:
- 使用 ASN.1 DER 编码(这是标准的)分别对每个证书进行编码。
- 使用 PEM 进一步使这些证书对基于 ASCII 的传输更具弹性;这也允许将其中的几个存储在一个文件中(您称之为“PEM 包”);
- 将证书存储在 PKCS#7(又名CMS)
SignedData
对象中。ASignedData
名义上是一种用于嵌入已签名数据的格式;但是您可以省略数据并完全包含零签名,在这种情况下,您有某种外壳,其中包含一个用于嵌入“额外证书”的字段(名义上,这些证书有助于验证签名)。这是对现有标准的重用,该标准并不打算这样做,但现有软件可以做到这一点。Microsoft 将其称为“PKCS#7 证书”或“P7B 文件”。
- 使用 PKCS#7
SignedData
但也对其进行 PEM 编码(因此您可以在概念上将其中的几个存储在一个文件中)。
- PKCS#12(也称为“PFX”)。这种格式还允许存储其他类型的对象,并且包括基于密码的加密规定,因此它通常用于存储证书及其私钥。(显然,没有人想过 PEM 编码 PKCS#12 档案。)
私钥也有自己的格式。例如,PKCS#1为 RSA 私钥定义了一个基于 ASN.1 的编码,OpenSSL 将愉快地使用它,然后使用“BEGIN RSA PRIVATE KEY”标头进行 PEM 编码。该格式可以进一步包装到PKCS#8对象中,其中包括算法的基于 ASN.1 的标识符,以及对基于密码的加密的可选支持;然后, OpenSSL也会对 PKCS#8 文件进行编码,这次使用“BEGIN PRIVATE KEY”或“BEGIN ENCRYPTED PRIVATE KEY”(PEM 标头中没有算法指示),具体取决于是否使用了基于密码的加密。或者,原始 PKCS#1 格式也可以使用 OpenSSL 实现但未记录的 PEM 扩展进行密码加密(OpenSSL 的源代码应该是规范)。
总结:一团糟。