web-dev-qa-db-ja.com

Rubyで公開鍵を作成するときに、「PUBキーでもPRIVキーでもない::ネストされたasn1エラー」の原因は何ですか?

OpenSSL :: PKey :: RSAモジュールに.pemファイルを渡して公開鍵を構築する場合、応答の原因は何ですか。

OpenSSL::PKey::RSAError: Neither PUB key nor PRIV key:: nested asn1 error
from /Users/Matt/projects/placepop/lib/apn.rb:48:in `initialize'
from /Users/Matt/projects/placepop/lib/apn.rb:48:in `new'
from /Users/Matt/projects/placepop/lib/apn.rb:48:in `open'
from (irb):1

ここにソースがあります:

cert = File.join(Rails_root, 'config', 'apns', 'sandbox-cert.pem')
APN_CONFIG = { :delivery => { 
                              :Host => 'gateway.sandbox.Push.Apple.com', 
                              :cert => cert,
                              :passphrase => "",
                              :port => 2195 },
               :feedback => {  
                              :Host => 'feedback.sandbox.Push.Apple.com',
                              :port => 2196,
                              :passphrase => "",
                              :cert => cert} }


options = APN_CONFIG[:delivery].merge(options)
cert = File.read(options[:cert])
ctx = OpenSSL::SSL::SSLContext.new
ctx.key = OpenSSL::PKey::RSA.new(cert, options[:passphrase])
ctx.cert = OpenSSL::X509::Certificate.new(cert)

sock = TCPSocket.new(options[:Host], options[:port])
ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
ssl.sync = true
ssl.connect
37
Matthew

PEMファイルは公開鍵ではなく、多くのフィールドの中に公開鍵が含まれている、base64でエンコードされたX509証明書です。 RubyやOpenSSLはわかりませんRubyモジュールですが、PEMファイルを読み込んでX509証明書を出力する関数を探します。次に、公開鍵を証明書。

私は同じ問題を抱えていますが、原因は異なりました。今何を推測する:)

...

いまいましいパスワードが間違っていました:(その「解決策」を3日間検索しました。「ネストされたasn1エラー」ではなく「申し訳ありません、それは間違ったパスワードです!」でしたが、とにかくこれは誰かを助けるでしょう。

31
2called-chaos

たとえばdotenvを使用している場合は、値を"で囲み、改行用に\nを使用する必要があります。

PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nMIICW  ... UcuUtU0eIl\n-----END RSA PRIVATE KEY-----"
16
Dorian

私の問題は、OpenSSL::PKey::RSA.new()がファイルパスではなくファイルcontentsを必要とすることでした。したがって、このようなものを使用するとうまくいきました:

OpenSSL::PKey::RSA.new(File.read "./spec/support/keys/server.key")

OPはすでにこれを行っていましたが、これが誰かを助けることを願っています。無効なパスを指定しても警告は表示されないため、ファイルのパスではなくファイルの内容であると見なされます。

3
Tyler Collier

私にも同様の問題がありましたが、私にとってid_rsa.pubファイルのpemファイルを最初から作成していませんでした。私にとっては、既存の公開鍵からpemファイルを作成する必要がありました。

ssh-keygen -f testing_rsa.pub  -e -m pem > pem

次に、そのOpenSSL文字列を、使用されているテストファイルにコピーしました。結局このように見えました。

@pub_key = "-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAoxi2V0bSKqAqUtoQHxWkOPnErCS541r6/MOSHmKOd6VSNHoBbnas\nZRQSDUTbffB6C++DbmBCOHmvzYORD0ZWYgyMcgbYJD48Z2fe0nm+WMYN5u8DPnTP\nvf8b/rJBxGF0dsaoFAWlB81tTnKFCxAbCSgfmQt+Vd4qupGZ5gGu9uoKlaPjmYuA\nIxIjUMcu3dov7PQ+PZIvdkM0fiz8YIl8zo+iWWyI2s6/XLoZJ4bYs2YJHZDf6biU\nsZhs8xqh/F6qlcRt3Ta25KMa0TB9zE3HHmqA/EJHFubWFRCrQqpboB0+nwCbmZUl\nhaxA79FRvYtORvFAoncoFD4tq3rGXcUQQwIDAQAB\n-----END RSA PUBLIC KEY-----\n"
.
.
.
OpenSSL::PKey::RSA.new(@pub_key)

その後、メソッドはそのエラーをスローしなくなりました。

3
Ninjaxor

.pemファイルはこの形式です。

public_key_file.pem:

-----BEGIN PUBLIC KEY-----

// Your public key goes here

-----END PUBLIC KEY-----

private_key_file.pem:

-----BEGIN RSA PRIVATE KEY-----

// Your private key goes here

-----END RSA PRIVATE KEY-----
2
Nikhil Karkera

Railsでdotenvを使用しているときにこのエラーが発生しました。問題はdotenv gemに関するものではありませんでした。印刷によって確認された正しい値を割り当てていたENV ['PRIVATE_KEY']

[〜#〜] yaml [〜#〜]ファイルに[〜#〜] erb [〜#〜]処理でこの値をロードしていたため、問題が発生しました\ n文字が削除されたため、値が無効になりました

私が見つけた回避策は[〜#〜] yaml [〜#〜]ではなく、直接ENV ['PRIVATE_KEY']を使用することでした

1
hulksyed07

私はテストでWebrickを使用しており、間違ったクラスで秘密鍵をインスタンス化しようとすると、次のエラーメッセージが表示されました。

    SSLCertificate: OpenSSL::PKey::RSA.new(File.open(MOCK_CERT).read),

しかしthisは機能しました:

    SSLCertificate: OpenSSL::X509::Certificate.new(File.open(MOCK_CERT).read),

Facepalm

0
Julien

私の場合、いくつかの変数に証明書が格納されている間、関数は秘密鍵を期待していました。入力を秘密鍵と交換すると、エラーが修正されました。

0