【问题标题】:How to Parse P12 File如何解析 P12 文件
【发布时间】:2021-06-03 15:41:54
【问题描述】:

我正在编写一个解析工具来提取 C 语言中 P12 文件的每个字段,OpenSSL 对我的项目来说太大了。 阅读PKCS#系列文档和ASN.1文档后,我了解了基本的解析步骤。 我使用OpenSSL生成一个自签名的P12文件,在解析过程中出现了一些问题:

  1. 为什么证书没有存储在 Safebag 中,在我的情况下它存储在 EncryptedData 字段中?
  2. localKeyId 属性是什么意思?它有一个 OctetString,这个 OctectString 是做什么用的?
  3. 为什么 encryptedContentInfo 的 contentType 是 id-data?我认为应该是 id-encryptedData。就我而言,证书存储在 encryptedContentInfo 字段中。

谢谢, 长城

【问题讨论】:

  • “太大”是什么意思? libssl 的大小约为 3MB。
  • 这是一个纯编程问题。最好在 SO 询问。
  • @MechMK1,我们使用的MCU只有1M内存。我们想在嵌入式系统中解析 P12 文件。
  • @mentallurg,P12 文件是与安全相关的文件。这就是我在这里提问的原因。希望高手能帮帮我。

标签: certificate key pkcs#12 pkcs#7 pfx


【解决方案1】:

PKCS12 标准also available as rfc7292 正式允许选项的范围和组合非常广泛,但实际上只使用了其中的几个选项。基本上有3个级别:

  1. 文件的类型/结构 PFX 主要由 PKCS7/CMS ContentInfo 组成,理论上可以是“数据”或“签名数据”,但实际上总是前者(附加名义上可选的 MacData)并包含

  2. “AuthenticatedSafe”是一个或多个(几乎总是更多)内容信息的序列,每个内容信息(单独)可以加密或不加密并包含(如果适用,在解密后)

  3. 一个或多个“包”的序列,每个包都包含某种类型的实际数据,例如加密的私钥或证书以及可选属性。

在实践中通常有:

  • 一个具有 PKCS7/CMS 类型“加密数据”的 CI(级别 2)使用非常弱的算法 (RC2-40),其中包含一个或多个 CertBag,每个 CertBag 都包含一个证书及其任何属性,并且

  • 一个或多个 CI(s)(每个),类型为“data”,包含一个 PKCS8ShroudedKeyBag,其中包含一个加密的私钥(如所述使用 PKCS8),通常使用通常使用 3DES 的强算法以及属性。

My answer here 显示第一级解析以查找加密细节;进一步解析需要解密,如my answer here 中所示(针对特定情况)。

如前所述,所有包都可以有属性;在实践中,取决于实现,某些包可能具有“friendlyName”属性,其值旨在供人们使用,如果存在匹配的私钥和证书,它们都具有具有相同值的“localKeyId”属性以将它们绑定在一起,如my answer to a different but related Q 中所述。 “localKeyId”不是供人们使用的,您通常不应将其呈现给人们。

【讨论】:

  • 感谢您的详细解释。我想你回答了我的第二个问题。但我仍然不知道为什么证书没有存储在 Safebag 中,而是存储在“EncryptedData”字段中。正如 PKCS#12 定义的“A CertBag 包含某种类型的证书”。如何确定 ContentType 是 id-data 还是 id-encryptedData?
  • 在实践中,encryptedContenInfo 的 ContentType(用于证书)设置为 id-data,而不是 id-encryptedData。 PrivateKey 的 ContenType 设置为 id-data。我真的很困惑。
  • 再次阅读 PKCS#12 后,现在我明白了 ContentType 字段在每个不同级别的含义。如果 authSafe.ContentType 是 id-data,则表示 macData 字段存在,否则 macData 字段不存在。如果 ContentInfo.ContentType 为 id-data,则表示以下内容未加密;如果 ContentInfo.ContentType 为 id-encryptedData,则表示内容将遵循“EncryptedData”定义。并且 encryptedContentInfo.contentType 字段固定为 id-data(参见第 5.1 节,PKCS#12)。
  • 我在想为什么证书没有放在 SafeBag 中,是因为安全原因。由于 CertBag 的定义不包括任何加密。你怎么想? CertBag ::= SEQUENCE { certId BAG-TYPE.&id ({CertTypes}), certValue [0] EXPLICIT BAG-TYPE.&Type ({CertTypes}{@certId}) }
  • 每个真正的包,包括 CertBag,都是 SafeBag 的一个实例,每个 SafeBag 都在我所说的二级 ContentInfo 中。您是否在问为什么 CertBag 没有在包级别加密(如 PKCS8ShroudedKeyBag 是),或者为什么包含 CertBag 的 ContentInfo 加密 - 使用即使在 1996 年也很弱的算法?很久以前我没有直接的知识,但我猜这就是微软所做的,其他人只是复制它们,因为“如果它没有坏就不要修复它”。
猜你喜欢
  • 1970-01-01
  • 2013-04-11
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多