2011-01-08 14 views
3

RubyでRSA鍵ペアを生成しようとしていますが、主にthis blog postの例を使用しています。ここに私の少し変更したコードは次のとおりです。Ruby OpenSSLライブラリを使用しているときに公開鍵が無効です

def generate_keypair(passphrase) 
    rsa_key = OpenSSL::PKey::RSA.new(2048) 
    cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc') 
    private_key = rsa_key.to_pem(cipher, passphrase) 
    public_key = rsa_key.public_key.to_pem 
    return private_key, public_key 
end 

これが正常に秘密鍵と公開鍵を生成し、私は、ファイルシステム上のファイルへの出たものを書くことができます。

irb(main):002:0> private_key1, public_key1 = generate_keypair('test') 
[...output of keys...] 
irb(main):003:0> File.open("key.pem","w") {|f| f.write(private_key1) } 
=> 1766 
irb(main):004:0> File.open("pubkey.pem","w") {|f| f.write(public_key1) } 
=> 426 

私は、この公開鍵を使用しようとするとただし、OpenSSLは文句:

$ openssl rsautl -encrypt -inkey pubkey.pem -pubin -in text.txt -out text.ssl 
unable to load Public Key 

私は、秘密鍵から公開鍵を抽出するためにopensslツールを使用する場合は、すべての作品:

$ openssl rsa -in key.pem -pubout -out pubkey2.pem 
Enter pass phrase for key.pem: 
writing RSA key 
$ openssl rsautl -encrypt -inkey pubkey2.pem -pubin -in text.txt -out text.ssl 
$ openssl rsautl -decrypt -inkey key.pem -in text.ssl 
Enter pass phrase for key.pem: 
this is a 
file that 
needs to be 
encrypted 

Ruby OpenSSLライブラリが生成した公開鍵と、openssl cliツールが秘密鍵から抽出した公開鍵とは異なります。

$ cat pubkey.pem 
-----BEGIN RSA PUBLIC KEY----- 
MIIBCgKCAQEAzgNcsEL7yGBoLBYBXFYrDL6oLP8ZbW9+VwdoXyNG6Qt/NEhEx4Ww 
5yOxtXAbqeUwyvbTUxRrJ02dQcb4FGcSMDgz2QHIZyCuDJkgC9Wj7KI1Q7g0GV+7 
DcZvLcwPZOhLXqUzlcZXjDWM1PZ+az734qEribgyI+87LB8TujG8v5iOvdzT/Je4 
JAllToZVGC3RddfTc6ww37gB39B++FYNzPg+nrIEU45KgEWPo2eJxBpX29lACh6q 
EEBCQr9xyLxOC2eomYIl3dG2dV7nGGH7Pur2HjppgJphBvNkwxIWUa/pD6hAnOQ4 
MkDDFGwWv7eJLb4UZuZjafTbqokHved3bwIDAQAB 
-----END RSA PUBLIC KEY----- 

$ cat pubkey2.pem 
-----BEGIN PUBLIC KEY----- 
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzgNcsEL7yGBoLBYBXFYr 
DL6oLP8ZbW9+VwdoXyNG6Qt/NEhEx4Ww5yOxtXAbqeUwyvbTUxRrJ02dQcb4FGcS 
MDgz2QHIZyCuDJkgC9Wj7KI1Q7g0GV+7DcZvLcwPZOhLXqUzlcZXjDWM1PZ+az73 
4qEribgyI+87LB8TujG8v5iOvdzT/Je4JAllToZVGC3RddfTc6ww37gB39B++FYN 
zPg+nrIEU45KgEWPo2eJxBpX29lACh6qEEBCQr9xyLxOC2eomYIl3dG2dV7nGGH7 
Pur2HjppgJphBvNkwxIWUa/pD6hAnOQ4MkDDFGwWv7eJLb4UZuZjafTbqokHved3 
bwIDAQAB 
-----END PUBLIC KEY----- 

ここで何が起こっているのかよく分かりませんが、Ruby OpenSSLライブラリが無効な公開鍵pemファイルを生成しているようです。私は何か間違っているのですか?

+0

http://stackoverflow.com/a/36302768/232250 –

+0

[OpenSSL RSAキーと.Net](http://stackoverflow.com/q/30475758)も参照してください。 。 OpenSSLを使用してPKCSと従来のエンコーディング( 'BEGIN RSA PUBLIC KEY'と' BEGIN PUBLIC KEY')の両方でキーを保存する方法について説明します。 – jww

答えて

3

OSSLはその形式をサポートしていないようです。 "openssl rsa"が生成するものは、RSA_PUBKEY構造体です:RSAキーであることを示すASN.1-「タグ付き」(OID付き)のPUBKEYレコードです。 Rubyが生成するものは、「生の」RSAキーです(ここでバイトはRSAであることを示していないので、PEMヘッダーで宣言する必要があります)。

OSSLは、PEM_write_bio_RSAPublicKeyの代わりに/ PEM_write_bio_RSA_PUBKEY(または汎用のPEM_write_bio_PUBKEY)のようなAPI関数を使用する必要があります。

+0

ありがとう、それは非常に有用です。私はこの情報をPEMヘッダーに追加する方法についてのドキュメントを探していましたが、何も見つかりませんでした。お勧めはありますか?私はopensslにシェルする必要はありませんが、最後の手段として可能性があります。 – corywright

+0

@corywright:このバグをOSSLに報告してください。可能であれば、公開鍵をエンコードする別の方法を提供するパッチを作成してください。原則として、純粋なRubyで2つのフォームを変換することは可能ですが、それを行うにはASN.1 DERの専門家でなければなりません。 –

関連する問題