httpsでMechanizeを使う

※環境はWindowsruby1.9.3、mechanize-2.3です。

Mechanizeはrubyスクレイピングするとしたら、もう定番と言ってもいいライブラリでしょう。普通に使う分には色々記事が既にあるのでここではhttpsではまった部分をちょっとだけ書いてみます。

デフォルトでは https で接続すると


OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
とエラーが出ます。証明書の検証に失敗しました、ということのようです。なのでとり得る方法は2つ。

  • 証明書を検証しない(=> セキュリティー的に問題あり)
  • 認証局の証明書をちゃんと指定する

■1. 証明書を検証しないでスクレイピングする方法

検証方法を verify_mode にセットする。
検証しない場合は


require "mechanize"
browser = Mechanize.new
browser.verify_mode = OpenSSL::SSL::VERIFY_NONE
browser.get("https://...")
とすればOK。

他の定数はこちらを参照。

■2. 認証局の証明書を指定する

これは少し面倒なのだが、先にブラウザから認証局の証明書をエクスポートしておく必要がある。
例えばFireFoxだと、スクレイピング対象となるhttpsのサイトに接続して、「ツール」→「ページ情報」→「セキュリティ」→「証明書を表示」をクリックすると、証明書ビューアが表示される。
そこで対象のサイトの一番上の階層にある認証局(CA)をクリックして「エクスポート」ボタンを押して適当に保存する(C:/ca.crtとする)。

ここまでが前準備で、これが終われば


require "mechanize"
browser = Mechanize.new
browser.ca_file = "C:/ca.crt"
browser.get("https://...")
とすればアクセスできるはず。
(証明書によってはアクセスできない場合がある。詳しくはよくわからない・・。VeriSign Class 3 Public Primary Certification Authority - G5 がルート証明書の場合にうまくいかないようだ)


ちなみにmechanize内部では net/http を使用しているようですので、最悪自分の思うとおり動かなければ


browser = Mechanize.new
browser.agent.http = ...
とすればなんでもできます。