2011-11-02 10 views
6

私は、APIとのSSL接続が必要なクライアント用のアプリケーションを開発中です。私は3つのファイルを提供されています。信頼ルート証明書(.cer)ファイル、中間証明書(.cer)ファイル、および署名付き応答ファイルが含まれています。これをインストールするための指示は、IISまたはJavaのkeytoolプログラムに関連しています。私はRuby on Railsでアプリケーションを構築しているので、どちらもオプションではありません(私が知っている限り)。Ruby on RailsアプリケーションでのクライアントSSLの使用

証明書はAPIサービスを実行する組織によって自己署名されており、https接続を相互認証するためのクライアント証明書が与えられているようです。私は、署名された応答ファイルが

を何

  • は、私が"Using a self-signed certificate"this article on OpenSSL in Rubyを読んだ
  • APIを接続して使用するように自分のアプリケーションで証明書を使用する方法に

    1. わからないんですが、いずれにも思いません(そしてどちらも混乱するJava/JRubyに依存している)。

      いずれのポインタも大歓迎です。あなたのコメントに基づいて

    +0

    あなたがリンクしているmathish.comの記事は、実際にはjRubyとは関係ありません。私がデモしたコードは、ActiveMQメッセージブローカーと話をしなければなりませんでした。これはJavaベースで、JavaのSSL証明書の規則を使用しています。このコードのコメントの大部分は、JavaのSSL証明書をキーストアから抜き出す方法と、OpenSSLが認識するフォーマットに思い出させるためのものでした。 –

    +0

    .cerファイルをテキストエディタで開くと、 '----- BEGIN CERTIFICATE -----'などで始まるのでしょうか? –

    +0

    ちょっと@ian、それを明確にしてくれてありがとう。彼らは '----- BEGIN CERTIFICATE -----'で始まらない。いいえ。それをテキストエディタで開きます。内容が何らかの方法で暗号化されているように見えます(ASCIIシンボルやスペースなどの無作為な束、見やすい文字はありません)。 – jkale

    答えて

    4

    、私は(:openssl x509 command参照):あなたはopenssl x509コマンドを使用してPEMに変換することができ、証明書がDER形式であることを仮定している。その後

    openssl x509 -inform DER -outform PEM -in certfile.cer -out certfile.pem 
    

    、あなたが指示することができますRubyのOpenSSLライブラリは次のようなものとのSSL接続を認証するために信頼されたルート証明書を使用するには:

    require 'socket' 
    require 'openssl' 
    
    tcp_sock = TCPSocket.new("my.host.tld", 443) 
    ctx = OpenSSL::SSL::SSLContext.new 
    ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT 
    #You may need to specify the absolute path to the file 
    ctx.ca_file = "certfile.pem" 
    
    ssl_sock = OpenSSL::SSL::SSLSocket.new(tcp_sock, ctx) 
    ssl_sock.sync_close = true 
    ssl_sock.connect 
    begin 
        ssl_sock.post_connection_check('my.host.tld') 
    rescue 
        puts "Certificate host did not match expected hostname" 
    end 
    

    はその後、あなたが読んで、他のRubyのIOオブジェクトと同じようssl_sockに書き込むことができるはずです。あなたがssl_sockを作成する前に

    ctx.cert = OpenSSL::X509::Certificate.new(File.read("my_cert.pem")) 
    ctx.key = OpenSSL::PKey::RSA.new(File.read("my_key.rsa")) 
    

    :あなたは、サーバーがユーザーを認証できるようにするために使用するクライアント証明書を与えられている場合は、とのSSLコンテキストを設定することができます。

    を最後に、アドバイスの最後のピースを、あなたはRESTfulなAPIにアクセスしている場合、あなたはrest-clientのような宝石を使用して検討する必要があります:OpenSSLライブラリも(OpenSSL::PKey moduleを参照)DSAなどのRSA以外のキータイプをサポートHTTP/S接続のすべてを直接処理するのではなく、そのようなライブラリが適切かどうかは、使用しているサービスによって異なります。

    +0

    'SSLContext'オブジェクトの' ca_file'属性とは異なり、 'cert'と' key'はファイル名だけでなく、実際のファイルデータを必要としていることに注意してください。 –

    +0

    また、証明書の名前の確認に気をつけなければ、 'post_connection_check'とその' begin ... rescue'ブロックを実行する必要はありません。 –

    +0

    大きなコードブロックの行4は 'sock'の代わりに' tcp_sock'でなければなりません – SnareChops

    関連する問題