42

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
4

10 に答える 10

36

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

...

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

于 2012-10-22T12:31:04.563 に答える
15

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

于 2010-02-20T00:50:50.377 に答える
4

私も同様の問題を抱えていましたが、そもそも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)

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

于 2013-03-19T22:11:49.427 に答える
3

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

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

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

于 2014-07-10T05:25:07.370 に答える