Pem证书中的私钥如何加密?

Jér*_*nge 1 encryption ssl curl pem

作为调试问题的一部分,我试图了解pem证书中私钥的加密方式,因为我想知道是否curl无法对私钥进行解密。

我的-----BEGIN ENCRYPTED PRIVATE KEY-----部分中有一个pem

它用密码加密了吗?还有其他某种加密方案吗?

更确切地说

一位同事建议,pem即使没有密码,也可以对私钥进行加密。这是对的吗?

bar*_*njs 8

私钥可以有几种不同的记录形式,但是最常见的形式是PKCS#8(在RFC 5208中定义)。

RFC定义了两种形式的结构。

PrivateKeyInfo ::= SEQUENCE {
  version                   Version,
  privateKeyAlgorithm       PrivateKeyAlgorithmIdentifier,
  privateKey                PrivateKey,
  attributes           [0]  IMPLICIT Attributes OPTIONAL }
Run Code Online (Sandbox Code Playgroud)

“此结构的版本号,以防其演变”,“如何识别用于读取privateKey的解析器”,“一些资料,希望您可以阅读”,“有关该资料的一些数据,也许”。

在PEM编码后,PrivateKeyInfo会获得标签“ PRIVATE KEY”,如“ BEGIN PRIVATE KEY”中一样。您没有其中之一。

另一种形式是

EncryptedPrivateKeyInfo ::= SEQUENCE {
  encryptionAlgorithm  EncryptionAlgorithmIdentifier,
  encryptedData        EncryptedData }
Run Code Online (Sandbox Code Playgroud)

“我如何加密资料”,“加密资料”。

EncryptedPrivateKeyInfo带有您所拥有的PEM标签“ ENCRYPTED PRIVATE KEY”。

调查其中之一:

$ openssl asn1parse -i -dump < rsa.enc.p8
    0:d=0  hl=4 l= 710 cons: SEQUENCE
    4:d=1  hl=2 l=  64 cons:  SEQUENCE
    6:d=2  hl=2 l=   9 prim:   OBJECT            :PBES2
   17:d=2  hl=2 l=  51 cons:   SEQUENCE
   19:d=3  hl=2 l=  27 cons:    SEQUENCE
   21:d=4  hl=2 l=   9 prim:     OBJECT            :PBKDF2
   32:d=4  hl=2 l=  14 cons:     SEQUENCE
   34:d=5  hl=2 l=   8 prim:      OCTET STRING
      0000 - e9 37 68 99 cb 9c 4f 10-                          .7h...O.
   44:d=5  hl=2 l=   2 prim:      INTEGER           :0800
   48:d=3  hl=2 l=  20 cons:    SEQUENCE
   50:d=4  hl=2 l=   8 prim:     OBJECT            :des-ede3-cbc
   60:d=4  hl=2 l=   8 prim:     OCTET STRING
      0000 - 16 ad ce 41 47 e8 ba 85-                          ...AG...
   70:d=1  hl=4 l= 640 prim:  OCTET STRING
     <data_omitted />
Run Code Online (Sandbox Code Playgroud)

数据已基于基于密码的加密方案2(PBES2)进行了加密。输入的密码/密码由基于密码的密钥派生功能2(PBKDF2)转换为密钥材料,并带有盐(在加密时随机选择,但解密时必须相同),e9 37 68 99 cb 9c 4f 10并使用2048(0x800)的迭代次数。该密钥在CBC模式下用于IV的TripleDES加密(IV在加密时随机选择,但必须相同)16 ad ce 41 47 e8 ba 85。加密的内容为640字节,然后将被解析为PrivateKeyInfo结构。

除了PKCS#8以外,用于传输私钥的唯一其他选择是PKCS#12 / PFX,但是该数据结构没有标准的PEM表示形式。最新版本的PKCS#12允许以EnvelopedCMS / PKCS#7的样式将数据加密为证书。

因此,对于一些简洁的答案:

  • ENCRYPTED PRIVATE KEY形式被加密。
    • 使用口令加密的可能性为99.999%。
    • 但是可能有人使用口令以外的其他方法教过OpenSSL有关PBES2 KDF的问题:)。
  • PRIVATE KEY表格未加密。
    • RSA PRIVATE KEY表单也未加密,但这是PKCS#1 RSAPrivateKey,而不是PKCS#8 PrivateKeyInfo。
  • 如果curl不提示您输入密码,则它不支持加密的私钥。
  • 虽然在没有密码短语的情况下存在一个加密的私钥并不是不可能的,但它绝对不常见,并且绝对不在PEM编码的有效负载中。