私の環境について
- 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
参考ページを見ながらやりましたが、どうもうまくいきませんでした…。
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"
これで、通信ができるようになりました。
まとめ
突然エラーになったので、めっちゃ慌てました…。
再現性がないので、後半のコマンドのどれかはいらないかもしれません。