如何解析 P12 文件

问题描述

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

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

    enter image description here

谢谢, 长沙

解决方法

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

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

  2. 'AuthenticatedSafe' 是一个或多个(几乎总是多个)ContentInfo(s)的序列,其中每个(单独)可能被加密或不加密并包含(解密后,如果适用)

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

在实践中通常有:

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

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

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

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