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の証明書入手方法は、、
- IEでgoogleのSSLサイトを閲覧して、SSLの鍵が出ている状態で、鍵をダブルクリック
- サイト(この例ではgoogle)の証明書が出るので証明書のパスのタブを選択して、一番根っこのCAを選択(googleの場合、VeriSign)
- これを選択して、証明書の表示を押す
- googleの場合、VeriSign Class3 Public Primary CAとなっている。
- これをエクスポート(手順は、ファイルにコピーを選んで、Base64 encoded X509を指定、ファイル指定で落とす)
- 上記手順で落としたファイルに対して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をちゃんと勉強していないので、結果から判断しています。間違っている等のご指摘がありましたらコメントに記載ください。