ruby open ssl api for encrypted key(without nodes option)

时间:2018-01-09 22:24:37

标签: ruby-on-rails ruby ssl encryption openssl

在安装了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获得相同的结果?

1 个答案:

答案 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中?