pem 证书中的私钥是如何加密的?

How is a private key encrypted in a pem certificate?

作为尝试调试问题的一部分,我试图了解如何在 pem 证书中加密私钥,因为我想知道 curl 是否无法解密私钥。

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

是否使用密码加密?是否涉及其他类型的加密方案?

更准确地说

一位同事建议即使没有密码也可以在 pem 中加密私钥。这是正确的吗?

如果您使用密码,您的密钥当然是加密的!

A passphrase is a word or phrase that protects private key files. It prevents unauthorized users from encrypting them. Usually it's just the secret encryption/decryption key used for Ciphers.

私钥可以有几种不同的记录形式,但最常见的形式是 PKCS#8,在 RFC 5208.

中定义

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

PrivateKeyInfo ::= SEQUENCE {
  version                   Version,
  privateKeyAlgorithm       PrivateKeyAlgorithmIdentifier,
  privateKey                PrivateKey,
  attributes           [0]  IMPLICIT Attributes OPTIONAL }

“这个结构的版本号,以防它进化”,“如何识别使用什么解析器来读取privateKey”,“一些东西,希望你能读懂”,“关于这些东西的一些数据,也许。

当 PEM 编码时,PrivateKeyInfo 获得标签“PRIVATE KEY”,如“BEGIN PRIVATE KEY”。你没有其中之一。

另一种形式是

EncryptedPrivateKeyInfo ::= SEQUENCE {
  encryptionAlgorithm  EncryptionAlgorithmIdentifier,
  encryptedData        EncryptedData }

“我是如何加密东西的”、“加密的东西”。

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 />

数据在基于密码的加密方案 2 (PBES2). The input password/passphrase is transformed into key material by Password-Based Key Derivation Function 2 (PBKDF2) 下使用盐(在加密时随机选择,但必须相同才能解密)e9 37 68 99 cb 9c 4f 10 加密并使用迭代计数为 2048 (0x800)。该密钥用于 CBC 模式下的 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 编码的有效负载中。