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 编码的有效负载中。
作为尝试调试问题的一部分,我试图了解如何在 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 编码的有效负载中。