作为尝试调试问题的一部分,我试图了解如何在pem
证书中加密私钥,因为我想知道curl
是否无法解密私钥
我的-----BEGIN ENCRYPTED PRIVATE KEY-----
中有pem
部分。
是否使用密码加密?是否涉及其他类型的加密方案?
更确切地说
一位同事建议,即使没有密码短语,私钥也可以pem
加密。这是对的吗?
答案 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
表单已加密。
PRIVATE KEY
表单未加密。
RSA PRIVATE KEY
表单也未加密,但它是PKCS#1 RSAPrivateKey,而不是PKCS#8 PrivateKeyInfo。答案 1 :(得分:0)
如果您使用密码短语,当然您的密钥已加密!
密码短语是保护私钥文件的单词或短语。 它可以防止未经授权的用户加密它们。 通常它只是用于密码的秘密加密/解密密钥。