X.509 和 PKCS#7 证书有什么区别?

信息安全 tls 证书 x.509
2021-08-20 09:14:51
  1. 我是否更正了在 Windows 中保存为“加密消息语法标准 - PKCS#7 证书 (.P7B)”的 .p7b 文件扩展名的调用文件 - 一个“PKCS#7 证书”?还是更好地称为“以 PKCS#7 格式保存的 X.509 证书”?

  2. 什么时候会选择一种证书格式而不是另一种?这些格式有什么特别的优点或缺点吗?

  3. 在我的前两次编辑之后添加这个问题。与 DER/PEM 文件格式相比,PKCS#7 格式有何不同?

谢谢


编辑 #1:Linux 下的 Firefox 让我能够将某些网站的证书导出为:

  • X.509 证书 (PEM)
  • X.509 证书 (DER)
  • X.509 证书 (PKCS#7)

这是否意味着这里的 PKCS#7 只是一种类似于但不同于 DER 的二进制文件格式?如果为 true,则 .p7b 文件只是以 PKCS#7 格式(与 PEM 或 DER 格式相反)保存的 X.509 证书。


编辑#2:跟进我的第一次编辑。此页面OpenSSL: Documents, pkcs7建议 PKCS#7 可以在 DER 或 PEM 中加密。由此我推断 PKCS#7 不是一种独特的二进制文件格式。现在我完全糊涂了。


编辑#3:好的,我想通了 PEM 和 DER 格式之间的关系。PEM 文件的 Base64 编码负载实际上是 DER 格式的数据。因此,最初 X.509 证书以 DER 格式编码,然后您可以选择将生成的“DER 编码证书”编码为“PEM 编码证书”。我仍然难以拟合 PKCS#7 拼图的一部分。


编辑#4:另一条信息。PKCS#7 似乎是一个容器,它允许在将多个 X.509 证书编码为 DER 格式之前将它们捆绑在一起(这与 PEM 格式不同,您可以将证书一个接一个地粘贴到同一个文件中) .

2个回答

您已经发展到基本正确,但是要添加几点并扩展@CoverosGene'的答案,这比我在编辑中感到自在的要多:

X.509在 ASN.1 中定义了一个证书(以及其他一些与此处不相关的内容),这是一种(非常!)通用的数据结构化方法,它具有多种定义的编码,其中 DER可分辨编码表示非常常见,并在此处使用。

PEM格式——对于证书只是其中一种的几种类型的数据——就像你所说的那样,只是以 base64 编码的二进制(DER)数据(编辑)通常每 64 个字符分成几行(但有变化),加上由破折号 + BEGIN 或 END + 数据类型组成的标题和尾行,在本例中为 CERTIFICATE + 破折号。这些行对人类来说看起来是多余的,但它们是预期的,并且主要是软件所需要的。PEM(隐私增强邮件)实际上是一个完整的安全电子邮件标准,除了它的编码格式之外,它现在几乎被遗忘了(见下文)。 (编辑)截至 2015 年,RFC 7468详细描述了现代加密数据中“PEM”格式的大多数使用。

PKCS#7由 RSA(公司,而不是算法)定义为加密和/或签名数据的多用途格式。它被移交给 IETF 并演变为 RFC 2630中的CMS 加密消息语法,然后是RFC 3369,然后是RFC 3852,然后是RFC 5652,因此是 Windows (inetopt) 提示符的措辞。“PKCS#7”通常用于表示原始 RSA PKCS#7 和 IETF 后继 CMS,就像“SSL”通常用于原始 Netscape 协议和 IETF 后继 TLS 传输级别安全性一样。

.p7b 或 .p7c格式是 PKCS#7/CMS 的一种特殊情况:SignedData 结构不包含“内容”和零个 SignerInfo,但包含一个或多个证书(通常)和/或 CRL(很少)早在这提供了一种标准方法来处理(编辑)组成所需的证书集(不一定按顺序)。

PKCS#7/CMS 也是(是?)ASN.1 并且根据情况可以是 DER 或BER,这是一种密切相关的编码,具有大多数 DER 解码器处理的一些非常小的差异。

虽然像任何 DER 或 BER 对象一样的 PKCS#7/CMS都可以是 PEM 格式的,但除了 openssl (编辑)之外我还没有看到任何实现,证书很少见。(JavaCertificateFactory只能从 DER 或 PEM 读取 PKCS7/CMS-certs,但CertPath.getEncoded只能将其写入 DER。)相比之下,单个证书的 DER 和 PEM 格式都很常见。

PKCS#7/CMS 也用作S/MIME安全电子邮件的基础(从 5751 开始的多个 rfcs)。基本上,PEM 将 PKCS#7 编码为 1980 年代电子邮件系统可以轻松处理的 ASCII 文本,而 S/MIME 将 CMS 表示为 MIME 实体,这些实体以现代电子邮件系统可以处理的多种方式编码

OpenSSL通过按顺序实现来混淆问题:处理 certs-CRLs-only 情况而不是完整 PKCS#7的pkcs7命令;实际处理 CRL 和证书的crl2pkcs7命令,但同样不是 PKCS#7 的其余部分;一个smime命令,它实际上处理 S/MIME 和 PKCS#7/CMS 对于大多数加密和/或签名消息的情况;和一个cms命令,它实际上处理 S/MIME 和 PKCS#7/CMS 以获得更完整的案例集。

因此,我将选项描述为:PEM 或 DER 格式的证书;PKCS#7 容器中的(单个)证书或简称为 p7,仅在适用的极少数情况下提及 PEM;或 PKCS#7 或 p7 中的证书链单个证书和证书链之间的语义差异至少与证书本身或容器中的格式差异一样重要。

这甚至没有达到证书本身(对于某些其他实体,通常是 CA 根或锚)与您用来证明自己的私钥 PLUS 证书(或通常是链)的组合之间的广泛混淆身份,例如作为 SSL/TLS 服务器或在签署 S/MIME 电子邮件时。使用最初的 Microsoft PFX 个人信息交换格式,或其标准化形式 PKCS#12 或“p12”。

PKCS #7 可以被认为是一种允许将多个证书捆绑在一起的格式,无论是 DER 编码还是 PEM 编码,并且可能包括证书和证书撤销列表 (CRL)。

根据RFC2315,PKCS#7 是

a general syntax for data that may have
cryptography applied to it, such as digital signatures and digital
envelopes. The syntax admits recursion, so that, for example, one
envelope can be nested inside another, or one party can sign some
previously enveloped digital data.