Rubyでhttps接続(昨日の続き)

https接続の際に証明書の検証に失敗する件だが、どうもベリサインの証明書に問題があるみたい。ベリサインの新しい証明書は中間認証局が承認した証明書になっていて、予めPC(というかブラウザ)にインストールされている証明書はその中間認証局で、ルート認証局はインストールされていないっぽい(詳細不明)。

こちらの図【ベリサイン SSLサーバ証明書製品の階層構造(2010年10月15日時点)】を見るとわかるのだが、「VeriSign Class 3 Public Primary Certification Authority - G5」というルート認証局の証明書は、大抵デフォルトでインストールされており、この認証局で承認された証明書のページに問題なくアクセスできる。

ただし、この「VeriSign Class 3 Public Primary Certification Authority - G5」をエクスポートした証明書ファイルを、RubyのNet::HTTPで参照してもVerifyエラーとなってしまう。おそらくルート証明書じゃないからだろうと予想しています(深く調べてない)。なので、上のpdfで「VeriSign Class 3 Public Primary Certification Authority - G5」は「Class 3 Public Primary Certification Authority」を参照元としてるようなので、「Class 3 Public Primary Certification Authority」の証明書をNet::HTTPで参照しなければならないようです。

ただこの「Class 3 Public Primary Certification Authority」の証明書がなんかブラウザのプリインストール証明書一覧に無いんですよね・・。どうなってるんでしょう。しかもググってもなかなか見つからないので困ったけど、ようやく見つけました。いくつかあるみたいです。

http://developers.gigya.com/@api/deki/files/25714/cacert.pem

Verisignだけでなく、他の認証局の証明書がいっぱい入ってますので、これさえあれば、同様の問題はほぼ解決すると思います。

http://www.verisign.com/support/roots.html

Verisign(本国)で公開されているページ。何故か日本のページには無いんですよねぇ。

https://www.globaltrustpoint.com/x509/x509trustcenter_list.jsp

ここもVerisignだけでなく色んな認証局の証明書をダウンロードできます。


ま、スクレイピングする時にわざわざ証明書のチェックなんてしなくていいので、verify_mode = OpenSSL::SSL::VERIFY_NONE ってしとけばええんやけどな!!