RubyでOpenSSL::SSL::SSLErrorが出たので対応した

私の環境について

  • Mac OS 10.10.5
  • homebrewを使用
  • RVMを使用

通信をするプログラムを動かしたら、SSLのエラーが出ました。

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

参考ページを見ながらやりましたが、どうもうまくいきませんでした…。

参考ページ: qiita: OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

CA証明書のパスがおかしい

参考ページのコメントのところに則って、対応をしてみたのですが、CA証明書のパスがおかしいのです。

#rubyで読み込むCA証明書のパス確認
ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"
# => "/etc/openssl/cert.pem"

/usr/local/etc/openssl/cert.pem とならないといけないのに、そうなりません。
参考ページでは、環境変数SSL_CERT_FILEに/usr/local/etc/openssl/cert.pemと指定すればいいとあります。そうしてみたのですが、結果は変わりませんでした。一体なにがおかしいのか…。

RVMは環境変数を考慮しない?

色々検索していたら、RVMのissueを発見しました。

github: Install tries to update /etc/openssl instead of /usr/local/etc/openssl

後半のほうで、環境変数を考慮しないよ、みたいに書いてあるっぽいなと思ったので、–disable-binaryオプションをつけて、Rubyを再インストールしたところ、homebrewのOpenSSLを考慮してくれるようになりました!

RVM: How to fix broken certificates in your operating system.

また、RVMのサイトにも書いてあるコマンドがあったのでこれもやってみました。

やったことを書いていく

# opensslの更新
brew update
brew uninstall openssl --force && brew install openssl
brew link openssl --force

# CA証明書をDLして移動する
curl -O http://curl.haxx.se/ca/cacert.pem
sudo mv cacert.pem /usr/local/etc/openssl/certs/
/usr/local/opt/openssl/bin/c_rehash

# ここからはどれかは必要ないかもしれない
rvm autolibs homebrew
rvm osx-ssl-certs update all

# Rubyの再インストール。これは必要。
rvm reinstall 2.2.3 --disable-binary

# rubyで読み込むCA証明書のパス確認
ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"
# => "/usr/local/etc/openssl/cert.pem"

これで、通信ができるようになりました。

まとめ

突然エラーになったので、めっちゃ慌てました…。
再現性がないので、後半のコマンドのどれかはいらないかもしれません。


カテゴリー Ruby | タグ | パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です