Ruby の OpenSSL ライブラリで証明書のエラー

タイトルの通り rvm でインストールした Ruby 1.9.3 で OpenSSL ライブラリを用いた時にエラーになりました。テストに使ったスクリプトは以下の通り。

require 'net/https'
https = Net::HTTP.new('encrypted.google.com', 443)
https.use_ssl = true
https.verify_mode = OpenSSL::SSL::VERIFY_PEER
https.request_get('/')

返ってくるエラーは次のような内容。

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

回避策として ruby が参照しているルート証明書のデフォルトのパスをチェック。

ruby -ropenssl -e 'p OpenSSL::X509::DEFAULT_CERT_FILE'

手元のマシンの場合、以下のパスに証明書があれば問題ない様子。

/Users/hoge/.rvm/usr/ssl/cert.pem

とりあえず、デフォルトの証明書をコピーします。

sudo cp /opt/local/share/curl/curl-ca-bundle.crt /Users/hoge/.rvm/usr/ssl/cert.pem

改めて実行するとエラーは出なくなるはず。

ちなみに一般的な Linux 系 OS の場合、デフォルトの証明書は

/etc/ssl/certs

にある事が多いようなので、それらの環境ではそこからコピーしてくれば動く可能性が高いと思われます。

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

なんて書いたらダメ、絶対。