chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

rubyでssl通信

rubyを使ってhttpsでWebサイトと通信するプログラムを作成。どうしてもSSLのサーバ認証がうまく通らなかった。

エラーの例

/usr/lib/ruby/1.8/net/http.rb:586:in `connect': certificate verify failed (OpenSSL::SSL::SSLError)

いろんなサイトを見ていると、サーバ証明書を取得して、パスを切れとある。

いろいろやった結果、ルート証明書を取ってきて、そこにパスを切るのが正しいと思われる。(結果より判断)
参考にした「うなの日記」様では、サイトの証明書とあり、本当はどっちが正しいのか分かりません。本気でやるなら、rubyが呼び出していると思われるopensslをちゃんと調べないといけないと思われます。

以下はGoogleのWebAPI Auth REST?をrubyで呼び出すサンプル。。

require 'net/https'
require  'cgi'
https = Net::HTTP.new('www.google.com',443)
https.use_ssl = true
https.ca_file = './verisign.cer'
https.verify_mode = OpenSSL::SSL::VERIFY_PEER
https.verify_depth = 5
args = 'accountType=GOOGLE&Email=' + CGI::escape('XXXXXXX@gmail.com') + '&Passwd=XXXXXXX&service=lh2&foo-bar-01';
puts args

https.start { |w|
 response = w.post('/accounts/ClientLogin',args)
 puts response.body
}

ca_fileはgoogleサーバ証明書を認証したVerisignの証明書を落としてきて入れた。

ちなみに、Verisignの証明書入手方法は、、

  1. IEgoogleSSLサイトを閲覧して、SSLの鍵が出ている状態で、鍵をダブルクリック
  2. サイト(この例ではgoogle)の証明書が出るので証明書のパスのタブを選択して、一番根っこのCAを選択(googleの場合、VeriSign)
  3. これを選択して、証明書の表示を押す
  4. googleの場合、VeriSign Class3 Public Primary CAとなっている。
  5. これをエクスポート(手順は、ファイルにコピーを選んで、Base64 encoded X509を指定、ファイル指定で落とす)
  6. 上記手順で落としたファイルに対してca_fileで選択する

■参考になった記事
Greg Houston氏?のブログ
http://ghouston.blogspot.com/2006/03/using-ssl-with-ruby-http-access2.html
うなの日記様より
http://d.hatena.ne.jp/unageanu/20070504

■本家マニュアル
class net::https
http://www.ruby-lang.org/ja/man/?cmd=view;name=net%2Fhttps

opensslをちゃんと勉強していないので、結果から判断しています。間違っている等のご指摘がありましたらコメントに記載ください。