特別なことをせずに RubyInstaller for Windows 2.0.0-p0 でセットアップした ruby で https を扱おうとすると「OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed」といったエラーが出るわけで、これを回避するために次のようなことをした。
まず ca-bundle.crt をどこかからもらってくる。僕は手元の Linux 機からコピーした。たとえば Fedora なら ca-certificates パッケージに含まれているだろう。
次に上のエラーが出てしまうプログラムのなるべく最初のあたり (openssl.rb を読み込む前というか ssleay32.dll かな) に下の一行を追加する。ca-bundle.crt のパスとかは適当に処理のこと。
ENV['SSL_CERT_FILE'] = File.expand_path('C:\Users\toshiharu\ca-bundle.crt')
詳しくはマニュアルで。
以下はテスト。
# test1.rb require 'open-uri' p open('https://www.google.com/')
C:\Users\toshiharu>ruby test1.rb C:/Ruby200-x64/lib/ruby/2.0.0/net/http.rb:917:in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError) from C:/Ruby200-x64/lib/ruby/2.0.0/net/http.rb:917:in `block in connect' from C:/Ruby200-x64/lib/ruby/2.0.0/timeout.rb:51:in `timeout' from C:/Ruby200-x64/lib/ruby/2.0.0/net/http.rb:917:in `connect' from C:/Ruby200-x64/lib/ruby/2.0.0/net/http.rb:861:in `do_start' from C:/Ruby200-x64/lib/ruby/2.0.0/net/http.rb:850:in `start' from C:/Ruby200-x64/lib/ruby/2.0.0/open-uri.rb:313:in `open_http' from C:/Ruby200-x64/lib/ruby/2.0.0/open-uri.rb:708:in `buffer_open' from C:/Ruby200-x64/lib/ruby/2.0.0/open-uri.rb:210:in `block in open_loop' from C:/Ruby200-x64/lib/ruby/2.0.0/open-uri.rb:208:in `catch' from C:/Ruby200-x64/lib/ruby/2.0.0/open-uri.rb:208:in `open_loop' from C:/Ruby200-x64/lib/ruby/2.0.0/open-uri.rb:149:in `open_uri' from C:/Ruby200-x64/lib/ruby/2.0.0/open-uri.rb:688:in `open' from C:/Ruby200-x64/lib/ruby/2.0.0/open-uri.rb:34:in `open' from test1.rb:2:in `' C:\Users\toshiharu>
# test2.rb ENV['SSL_CERT_FILE'] = File.expand_path('C:\Users\toshiharu\ca-bundle.crt') require 'open-uri' p open('https://www.google.com/')
C:\Users\toshiharu>ruby test2.rb #<Tempfile:C:/Users/TOSHIH~1/AppData/Local/Temp/open-uri20130508-1124-q0o1b> C:\Users\toshiharu>
私はca-bundle.crt を certifie.com からダウンロードしました。うまくいきました。ありがとうございます。