繁体   English   中英

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

[英]How is a private key encrypted in a pem certificate?

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

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

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

更确切地说

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

私钥可以有几种不同的记录形式,但是最常见的形式是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 )进行了加密。 输入的密码/密码通过基于密码的密钥派生功能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编码的有效负载中。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM