在安装了openssl lib的linux机器上,当您使用“-nodes”选项执行“openssl pkcs12”时,您将获得带有未加密私钥的输出,但如果跳过-nodes选项,则输出将具有加密的私钥。
e.g.
openssl pkcs12 -in test.pfx -out test.pem
您应该看到加密的私钥,如下所示
-----开始加密的私钥-----
MIIFDjBABgkqhkiGG7s =
-----结束加密的私钥-----
如何使用ruby的open ssl库实现上述目标?
这就是我使用ruby生成私钥的方式:
@private_key = OpenSSL::PKey::RSA.new 2048
@private_key.to_pem.to_s
编辑:
我想我的问题是这个命令如何加密私钥:
openssl pkcs12 -in test.pfx -out test.pem
,而:
“openssl pkcs12 -nodes -in test.pfx -out test.pem”
没有。如何使用ruby获得相同的结果?
答案 0 :(得分:1)
必须有更多的东西。也许问题需要改进。据我所知,您希望以PEM格式打印私钥。我不是一个红宝石程序员,但是通过阅读this,我在大约3分钟内完成ruby-docs.org工作:
$ cat ssl.rb
require 'openssl'
key = OpenSSL::PKey::RSA.new 2048
cipher = OpenSSL::Cipher.new 'AES-128-CBC'
pass_phrase = 'my secure pass phrase goes here'
key_secure = key.export cipher, pass_phrase
puts key_secure
选择您的密码和密码,瞧,您已使用对称密码加密密钥:
$ ruby ssl.rb
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,D8062F93C8854E593602D503E1FAC309
UsNQt/Bq7QBldOBU7NW6miCDuC+ODpeplaWQ9BvJW4Wg7j0AbKgMZAn7juegAbjG
JVkpdDNzhs37UVWmqwg64yYP6KEBGg4zCog2a993UHRvFTQb6tyugKHc+uFeyY+D
...
-----END RSA PRIVATE KEY-----
你还有什么想做的吗?
-
编辑:Asker已澄清问题是openssl pkcs12
在不使用-nodes
选项时使用了哪种加密。
-nodes
选项会关闭DES加密。 This page表明私钥创建的默认加密是三重DES,但我没有看到有关哪个DES选项的详细信息。 man pkcs12
的手册中也提到了这一点。在任何情况下,我都不清楚你是否需要确切地知道openssl使用了哪个密码,或者你的问题现在已得到解答。
你可以列出ruby的可用密码:
puts OpenSSL::Cipher.cipher
(如the docs中所述)
在我的系统上,有不同的DES密码可用,具有不同的参数:
des
des-cbc
des-cfb
des-cfb1
des-cfb8
des-ecb
des-ede
des-ede-cbc
des-ede-cfb
des-ede-ofb
des-ede3
des-ede3-cbc
des-ede3-cfb
des-ede3-cfb1
des-ede3-cfb8
des-ede3-ofb
des-ofb
des3
desx
desx-cbc
我不确定PKCS12规范是否应该使用哪个DES密码,或者openssl是否只有默认值。您是否想知道OpenSSL使用哪种DES密码?
我在openssl wiki看了一下,我在CBC模式下找到了对DES的引用,所以我猜你正在寻找的密码是DES-EDE3-CBC。
对不起,我想还不完全清楚你要回答的问题。如果您尝试做的是在不使用-nodes
时确切了解openssl如何编码私钥,您可以通过cat
将文件openssl asn1parse
看出来。也许这会有所帮助:你可以从你的ruby程序中以纯文本开头使用你的rsa私钥:
$ cat key.pem
-----BEGIN RSA PRIVATE KEY-----
MIIEpA....
-----END RSA PRIVATE KEY
$ cat key.pem | openssl asn1parse
0:d=0 hl=4 l=1188 cons: SEQUENCE
4:d=1 hl=2 l= 1 prim: INTEGER :00
7:d=1 hl=4 l= 257 prim: INTEGER ...
您会看到它被编码为长整数的ASN1 SEQUENCE。
但是,如果你通过往返pkcs12
:
$ openssl pkcs12 -inkey key.pem -out key.pfx -export -nocerts -nodes
(choose a password)
$ openssl pkcs12 -in key.pfx -out outkey.pem -nodes
(enter password)
您会发现您的密钥现在包含在一个新结构中,您可以将其转移到asn1parse
:
cat keyout.pem | openssl asn1parse
0:d=0 hl=4 l=1214 cons: SEQUENCE
4:d=1 hl=2 l= 1 prim: INTEGER :00
7:d=1 hl=2 l= 13 cons: SEQUENCE
9:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption
您现在有一个ASN1 rsaEncryption对象,其有效负载为大八位字符串。
这是你想要了解的吗?这些值如何封装在ASN1中?