【问题标题】:Can the same x509 certificate have two different PEM encoding?同一个 x509 证书可以有两种不同的 PEM 编码吗?
【发布时间】:2020-02-26 06:12:56
【问题描述】:

我相信 PEM 编码是独一无二的。

但是我已经看到同一个证书可以有两个不同的 pem 版本。或者至少,我有两个包含相同信息(序列号、CA 颁发者等)的 PEM 证书,所以它们应该是相同的。

同一个证书可以有两种不同的PEM编码吗?

【问题讨论】:

  • 尝试通过openssl x509 -in certificate.pem -text 运行它们,这将转储证书的内容。 (如果没有其他地方,您将拥有 openssl 作为 git 安装的一部分。)

标签: x509certificate x509


【解决方案1】:

同一组证书数据没有两种不同的编码版本。

PEM 中的表示可能略有不同。我的意思是,PEM 可能包含或缺少 PEM 页眉和页脚,Base64 编码的有效负载在 64 个字符后可能有也可能没有换行符,但它不会影响 Base64 编码的值,因为换行符不是编码的一部分并且被忽略通过 Base64 编码器/解码器。单个证书的原始值不变。

更新:

确切的 PEM 格式在 RFC 1421 中定义,但并不总是被遵循,我看到不同的演示文稿也可以称为 PEM(即使它们不严格遵循 RFC)。比如我看到的是这样的:

-----BEGIN XYX-----
<Base64 string split in 64 chars per line>
<Base64 string split in 64 chars per line>
<Base64 string split in 64 chars per line>
-----END XYZ-----

-----BEGIN XYX-----
<Long Base64 string split in single line (without line breaks>
-----END XYZ-----

甚至这个:

-----BEGIN XYX-----<Long Base64 string split in single line (without line breaks>-----END XYZ-----

或这些格式的变体。只有第一个例子是合法的 PEM 格式,其余的不兼容,但可以称为 PEM,因为它们有 PEM 的页眉和页脚,以及 Base64 编码的有效负载。

【讨论】:

  • 封装前和封装后边界在 PEM 中可选。空格的差异可以存在,但没有边界,它不再是 PEM。
  • base64 通常不需要换行符,在 XML 和 JSON 等其他一些标准中,导致一些(很多?)解析器松懈,但绝对每 64 个换行符根据 RFC1421 4.3.2.4 定义并由 RFC7468 2 重申,PEM 中需要这些元素。
【解决方案2】:

除了Crypt32 描述的非标准但经常被接受的(错误)编码:

RFC7468 中所述,X.509 证书使用了几种不同的“类型”,包括普通的CERTIFICATEX509 CERTIFICATEX.509 CERTIFICATE。它们包含相同的数据,这是否真的是不同的编码还有待商榷。

OpenSSL 和一些与之兼容的东西,有一个相关但不同的 PEM 类型TRUSTED CERTIFICATE,其中数据实际上由 X.509 证书(在 DER 中)加上一个包含 OpenSSL 专有的信任信息的附加 DER blob。这是不同的,但只有一点点。

一个或多个证书可以打包在 PKCS7 或 CMS“容器”中,如果它位于文件或 URL 中,通常使用 p7b 或 p7c 扩展名。 包含证书的 PKCS7/CMS 与证书本身不同,尽管它有时可以互换使用(Microsoft CertMgr,我在看你),以及 PKCS7/ 的 PEM 编码包含证书的 CMS 与证书本身的内容不同。

【讨论】:

  • 我投了赞成票,因为这是一个非常好的答案,但我认为另一个是我问题的最正确答案。对不起:)
  • 没问题。我的意思是添加可能对您或其他人有用的替代方案,而不是拒绝另一个;澄清。
猜你喜欢
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 2012-07-19
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多