読者です 読者をやめる 読者になる 読者になる

ここにタイトルが入ります

デザイン&プログラミングのことも書くし、それ以外のことも書く。

【Rails】httpsページ取得でエラー「OpenSSL Errors and Rails – Certificate Verify Failed – Gem::RemoteFetcher::FetchError」

Rails dev-tips

Webページのスクレイピングのため、RailsでMechanizeを使って開発をしておりました。
そして実行(httpsのページへアクセス)しようとするとエラー。

OpenSSL Errors and Rails – Certificate Verify Failed – Gem::RemoteFetcher::FetchError


人のマシンだと出ないのに自分のマシンでは出る。
何が足りんのよ。


まあよくある事象なので、検索すればすぐに解決法は出てくる。


SSL認証しない

接続先を信頼してるし、とりあえず動かしたい!って時はこれ。
SSL認証しない方向で、ってやり方。

require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

認証を担当しているOpenSSLに認証なしでOKの設定をしているよう。

…さすがにこれは気持ちが悪いというかよろしくないので、ちゃんとした解決方法を探してみました。


証明書を設定する

ググったらまさにそのものの解決法が。
真似したら問題なく解決しました!

〜大変助かりました!〜
Limi's Blog - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

$ rvm pkg install openssl
$ rvm reinstall $(rvm list strings | tr "\n" ',') --with-openssl-dir=$rvm_path/usr

$ cd ~/.rvm/usr/ssl
$ curl -O wget http://curl.haxx.se/ca/cacert.pem > cert.pem

※もしRubyを再インストールした後、Gemset使おうとして「stat できません」みたいなこと言われたら

$ rvm gemset pristine

とかすると動くかも。


rvmパッケージのOpenSSLをインストールして、それを指定してrubyを再インストール。
後はrvmのOpenSSLディレクトリに証明書を入れるだけ。

--wutg-openssl-dirでrvmパッケージのOpenSSLを使うのか
他の場所にインストールしてあるOpenSSLを使うのか指定できるってことだろうか?


なにはともあれ、curlで取ってきた証明書を使ってhttpsの認証を行なっているようで。

rvmのOpenSSLを使う代わりに、
OSに?インストールされてるOpenSSLを利用する解決法もある、のかな?

〜参考になりました!!〜
OpenSSL Errors and Rails – Certificate Verify Failed – Gem::RemoteFetcher::FetchError · RailsApps


何をやっているのかわからない…(゜_゜)

このSSHだかSSLとかの周りがいまいち理解できず腑に落ちない…
一体httpsでは何の認証がおこなわれているのか。
今回落としてきた証明書ってなんだ。


改めて今回行ったオペレーションについて調べていると、
手がかりになりそうな記事を発見!


〜大変参考になりました!〜
メモーる: ERROR -- : SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)


この方も全く同じことをやっているのですが、
記事をよく読んでみると、

・このエラーは「サーバ証明書の検証」で失敗している
・私がダウンロードしてきた証明書というのは「ルートCA証明書」というものらしい

ということがわかりました。



ちょっと、このヒントを手がかりに
今まで何度解説を読んでも腑に落ちなかったSSHSSL周りを自分なりに整理してみようと思います。


次回へ続く…