如何在pem证书中加密私钥?

时间:2017-04-28 07:49:38

标签: ssl curl encryption pem

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

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

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

更确切地说

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

2 个答案:

答案 0 :(得分:6)

私钥可以有几种不同的形式被写下来,但最常见的形式是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标记"加密的私钥",这就是你所拥有的。

调查其中一个:

$ 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)下加密。输入密码/密码通过基于密码的密钥派生函数2(PBKDF2)转换为密钥材料,使用盐(在加密时随机选择,但必须相同才能解密)e9 37 68 99 cb 9c 4f 10并使用迭代次数为2048(0x800)。该密钥用于CBC模式下的TripleDES加密,其中16 ad ce 41 47 e8 ba 85具有IV(在加密时随机选择,但必须与解密相同)。加密内容为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编码的有效载荷。

答案 1 :(得分:0)

如果您使用密码短语,当然您的密钥已加密!

  

密码短语是保护私钥文件的单词或短语。   它可以防止未经授权的用户加密它们。   通常它只是用于密码的秘密加密/解密密钥。