受密码保护的 *.pfx/PKCS 12 证书中使用了哪种加密算法?

信息安全 tls 证书 pfx
2021-08-17 18:11:24

正如标题所说,我找不到在受密码保护的 *.pfx/PKCS 12 证书中使用加密算法的任何资源。

4个回答

如果您有要检查的特定 .pfx 文件,您可以使用 openssl 确定使用了哪些加密方法:

openssl pkcs12 -info -in cert.pfx -noout

这可能会给你:

PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048

这要求您知道 .pfx 文件的密码。如果您不知道密码,您仍然可以使用以下方法找到最外层的加密方法:

openssl pkcs12 -info -in cert.pfx -nomacver -noout -passin pass:unknown

例如,这给出:

PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048

这个特定的证书文件是由 openssl 使用默认参数生成的,它看起来像:

  • 使用 40 位 RC2 和 SHA-1 的外部加密层。外部加密层包含证书。
  • 使用 3DES 和 SHA-1 的内部加密层。内部加密层包含私钥。

我认为这是不安全的,因为攻击者可以用简单的暴力破解最外层的加密(40 位加密加上 RC2 有各种漏洞),然后在内部加密层使用相同的密码。然而,这可能需要额外的调查。

Mike Ounsworth 的回答是正确但不完整的。PKCS #12指定了一种容器格式,但它也指定了一些自己的算法集:

PKCS #5 中定义的 PBES1 加密方案提供了许多用于派生密钥和 IV 的算法标识符;在这里,我们指定了更多,所有这些都使用附录 B.2 和 B.3 中详述的过程来构造密钥(和 IV,如果需要)。正如它们的名称所暗示的那样,下面的所有对象标识符都使用散列函数 SHA-1。
pkcs-12PbeIds                    OBJECT IDENTIFIER ::= {pkcs-12 1}
pbeWithSHAAnd128BitRC4           OBJECT IDENTIFIER ::= {pkcs-12PbeIds 1}
pbeWithSHAAnd40BitRC4            OBJECT IDENTIFIER ::= {pkcs-12PbeIds 2}
pbeWithSHAAnd3-KeyTripleDES-CBC  OBJECT IDENTIFIER ::= {pkcs-12PbeIds 3}
pbeWithSHAAnd2-KeyTripleDES-CBC  OBJECT IDENTIFIER ::= {pkcs-12PbeIds 4}
pbeWithSHAAnd128BitRC2-CBC       OBJECT IDENTIFIER ::= {pkcs-12PbeIds 5}
pbewithSHAAnd40BitRC2-CBC        OBJECT IDENTIFIER ::= {pkcs-12PbeIds 6}

如果您从上面的引用中注意到,它提到了算法的PKCS #5PKCS #5 指定了两种算法:PBES1 和 PBES2。

较旧的PBES1算法只是一组算法的列表:

pbeWithMD2AndDES-CBC OBJECT IDENTIFIER  ::= {pkcs-5 1}
pbeWithMD2AndRC2-CBC OBJECT IDENTIFIER  ::= {pkcs-5 4}
pbeWithMD5AndDES-CBC OBJECT IDENTIFIER  ::= {pkcs-5 3}
pbeWithMD5AndRC2-CBC OBJECT IDENTIFIER  ::= {pkcs-5 6}
pbeWithSHA1AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 10}
pbeWithSHA1AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 11}

PBES2允许您单独混合和匹配加密和PRF算法(与预定义的算法集相反)。我将在这里列出目录中的相关部分,以便您了解:

     B.1.  Pseudorandom Functions  . . . . . . . . . . . . . . . . .  28
       B.1.1.  HMAC-SHA-1  . . . . . . . . . . . . . . . . . . . . .  28
       B.1.2.  HMAC-SHA-2  . . . . . . . . . . . . . . . . . . . . .  29
     B.2.  Encryption Schemes  . . . . . . . . . . . . . . . . . . .  29
       B.2.1.  DES-CBC-Pad . . . . . . . . . . . . . . . . . . . . .  30
       B.2.2.  DES-EDE3-CBC-Pad  . . . . . . . . . . . . . . . . . .  30
       B.2.3.  RC2-CBC-Pad . . . . . . . . . . . . . . . . . . . . .  30
       B.2.4.  RC5-CBC-Pad . . . . . . . . . . . . . . . . . . . . .  31
       B.2.5.  AES-CBC-Pad . . . . . . . . . . . . . . . . . . . . .  32

回到 PKCS #12,它还为整个文件指定了MAC 算法(不是针对单个条目):

本文档使用一种特殊类型的 MAC,称为 HMAC [11] [20],它可以由各种散列函数中的任何一种构造而成。请注意,[20] 和 [11] 中的规范与 [9] 中的规范有些不同。HMAC 所基于的散列函数在保存 MAC 的 MacData 中标识;对于本标准的这个版本,散列函数可以是以下之一:SHA-1、SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224 或 SHA-512/256 [ 10]。

PKCS #5中也指定了相同的 MAC 算法:

     B.3.  Message Authentication Schemes  . . . . . . . . . . . . .  33
       B.3.1.  HMAC-SHA-1  . . . . . . . . . . . . . . . . . . . . .  33
       B.3.2.  HMAC-SHA-2  . . . . . . . . . . . . . . . . . . . . .  33

最后,正如 Mike Ounsworth 的回答所述,您可以选择任何您想要的算法,即使它不在 PKCS #12 或 PKCS #5 中。但是,它必须有一个OID才能在p12 文件的ASN.1表示中使用。

PKCS#12 格式的所有规范都在RFC7292中定义。

简短的总结是一个.p12文件(我假设也是微软的旧PFX格式,但我从未使用过它们)只是一种容器格式,它指定了这个文件的结构,但没有说明应该输入什么样的数据.

打个非常糟糕的类比,Microsoft Excel.xlsx格式规范指定了 Excel 保存文件的结构,但没有告诉您它允许包含哪些数据或公式;这由您运行的 Excel 版本控制。


如果您要在十六进制编辑器中打开 a .p12,您会发现标题中的一个字段是AlgorithmIdentifier: _____创建.p12记录的程序 A)使用哪种加密算法来加密数据,以及 B)哪个哈希算法是用于将密码变成密钥。据我所知,这里没有明确的清单。创建程序的程序.p12可以使用任何AlgorithmIdentifier它想要的东西,包括组成一个。

例如,如果我正在编写软件来读取和写入受密码保护的.p12文件,我可以设置AlgorithmIdentifier: AES256WithPBKDF2,这很好。但我也可以设置AlgorithmIdentifier: MikesCipherWithCatDoodles,只要另一端的软件知道如何处理它,它仍然可以。


TL;DR: PKCS#12 格式仅指定文件的结构,它没有列出哪些算法是合法的,因此实际使用的加密算法将取决于用于创建.p12文件的软件。

如果您想知道使用哪些算法来保护您的.p12文件,请查看您用于读取/写入它们的软件的文档。

由于这已被删除,为了完整起见:OpenSSL 可以通过几个步骤解析 PKCS12 文件,以查找有关所使用算法的信息,而无需密码。举个例子:

$ openssl req -newkey rsa:1024 -nodes -keyout se152866.key -x509 -subj /CN=example.net -out se152866.crt
$ openssl pkcs12 -export -in se152866.crt -inkey se152866.key -passout pass:sekrit -out se152866.p12
$ openssl asn1parse -inform der -in se152866.p12 -i
    0:d=0  hl=4 l=1521 cons: SEQUENCE
    4:d=1  hl=2 l=   1 prim:  INTEGER           :03
    7:d=1  hl=4 l=1463 cons:  SEQUENCE
   11:d=2  hl=2 l=   9 prim:   OBJECT            :pkcs7-data
   22:d=2  hl=4 l=1448 cons:   cont [ 0 ]
   26:d=3  hl=4 l=1444 prim:    OCTET STRING      [HEX DUMP]:(long,omitted)
 1474:d=1  hl=2 l=  49 cons:  SEQUENCE
 1476:d=2  hl=2 l=  33 cons:   SEQUENCE
 1478:d=3  hl=2 l=   9 cons:    SEQUENCE
 1480:d=4  hl=2 l=   5 prim:     OBJECT            :sha1
 1487:d=4  hl=2 l=   0 prim:     NULL
 1489:d=3  hl=2 l=  20 prim:    OCTET STRING      [HEX DUMP]:8B3C863D73B51E41CADC9272E1696740B885E69E
 1511:d=2  hl=2 l=   8 prim:   OCTET STRING      [HEX DUMP]:5992FE887D9EA8A3
 1521:d=2  hl=2 l=   2 prim:   INTEGER           :0800

将此与PKCS12 sec 4 和 4.1 中外部 PFX 的 ASN.1 进行比较我们看到“authSafe”在偏移量 26 处的 OCTET STRING 项的值中编码,标头长度 (hl) 4 给出 30。忽略 (PB )MAC并查看:

$ openssl asn1parse -inform der -in se152866.p12 -i -strparse 30
    0:d=0  hl=4 l=1440 cons: SEQUENCE
    4:d=1  hl=4 l= 671 cons:  SEQUENCE
    8:d=2  hl=2 l=   9 prim:   OBJECT            :pkcs7-encryptedData
   19:d=2  hl=4 l= 656 cons:   cont [ 0 ]
   23:d=3  hl=4 l= 652 cons:    SEQUENCE
   27:d=4  hl=2 l=   1 prim:     INTEGER           :00
   30:d=4  hl=4 l= 645 cons:     SEQUENCE
   34:d=5  hl=2 l=   9 prim:      OBJECT            :pkcs7-data
   45:d=5  hl=2 l=  28 cons:      SEQUENCE
   47:d=6  hl=2 l=  10 prim:       OBJECT            :pbeWithSHA1And40BitRC2-CBC
   59:d=6  hl=2 l=  14 cons:       SEQUENCE
   61:d=7  hl=2 l=   8 prim:        OCTET STRING      [HEX DUMP]:2333FBA5F3B3DCC8
   71:d=7  hl=2 l=   2 prim:        INTEGER           :0800
   75:d=5  hl=4 l= 600 prim:      cont [ 0 ]
  679:d=1  hl=4 l= 761 cons:  SEQUENCE
  683:d=2  hl=2 l=   9 prim:   OBJECT            :pkcs7-data
  694:d=2  hl=4 l= 746 cons:   cont [ 0 ]
  698:d=3  hl=4 l= 742 prim:    OCTET STRING      [HEX DUMP]:(long,omitted)

我们看到两个 ContentInfo - 一个位于 authSafe 中的偏移量 4(文件中的 34),它使用 pbeWithSHA1And40BitRC2-CBC 和所示的 salt 和 2048 次迭代进行密码加密,一个位于偏移量 679 (709),在此级别未加密. 我们必须解密第一个以明确确定其类型,但我碰巧知道 pbe-RC2-40 始终用于 certbags,而且它恰好是我的(示例)证书的正确大小。对于第二个,我们可以在另一个级别的 702 (732) 解码其内容部分以获得SafeBag 的 SEQUENCE

$ openssl asn1parse -inform der -in se152866.p12 -i -strparse 732
    0:d=0  hl=4 l= 738 cons: SEQUENCE
    4:d=1  hl=4 l= 734 cons:  SEQUENCE
    8:d=2  hl=2 l=  11 prim:   OBJECT            :pkcs8ShroudedKeyBag
   21:d=2  hl=4 l= 678 cons:   cont [ 0 ]
   25:d=3  hl=4 l= 674 cons:    SEQUENCE
   29:d=4  hl=2 l=  28 cons:     SEQUENCE
   31:d=5  hl=2 l=  10 prim:      OBJECT            :pbeWithSHA1And3-KeyTripleDES-CBC
   43:d=5  hl=2 l=  14 cons:      SEQUENCE
   45:d=6  hl=2 l=   8 prim:       OCTET STRING      [HEX DUMP]:F75E440A3D7429C7
   55:d=6  hl=2 l=   2 prim:       INTEGER           :0800
   59:d=4  hl=4 l= 640 prim:     OCTET STRING      [HEX DUMP]:(long,omitted)
  703:d=2  hl=2 l=  37 cons:   SET
  705:d=3  hl=2 l=  35 cons:    SEQUENCE
  707:d=4  hl=2 l=   9 prim:     OBJECT            :localKeyID
  718:d=4  hl=2 l=  22 cons:     SET
  720:d=5  hl=2 l=  20 prim:      OCTET STRING      [HEX DUMP]:644ED94520BF6A45B81C70F73AE2143DE123A620

我们可以看到是一个 pkcs8ShroudedKeyBag,它又是一个来自 PKCS8 的 EncryptedPrivateKeyInfo,包含用 pbeWithSHA1And3-KeyTripleDES-CBC 加密的私钥和所示的 salt 和 2048 次迭代,加上一个 PKCS12Attribute,localKeyID。