なひです。

http://pc2.2ch.net/test/read.cgi/tech/1063028224/608
より

| Cygwin+http-access2でHTTPSのコンテンツを読みたいと思い、
| 簡単なテストをやってみたのですがうまくいきません

http-access2のSSLは安全側に倒してあるので、かなりめんどくさいです。

| #!/usr/bin/env ruby
| require "http-access2"
| print HTTPAccess2::Client.new.get( "https://www.rsa.com/" ).body.content

このコードでは、HTTPAccess2::Clientは、誰を信じろとも指定されなかった
ため、誰も信じません。というわけで、www.rsa.com(本体はwww.rsasecurity.com)の
SSLサーバーが返す証明書も信じず、結果的につながりません。

というわけで、HTTPAccess2::Clientに、誰を信じるか教えないといけません。
具体的には、信じる第三者の証明書(群)を指定する必要があります。

http://rrr.jin.gr.jp/dav/NaHi/rsa/wincertstore-rsasecurity.png
に、https://www.rsasecurity.comにアクセスしたときに、IEで
表示することができる証明書階層を表示した画面のキャプチャを
置きました。また、ruby/1.8に付属しているsample/openssl/cert_store.rbで
同じ表示をさせたものを、
http://rrr.jin.gr.jp/dav/NaHi/rsa/rsasecurity.png
に置きました。www.rsasecurity.comのサーバー証明書は、これらの画面で
示されている階層の一番下にあるため、その上にある4つのノードに対応する
証明書を取ってきて、HTTPAccess2::Clientに教えてやる必要があります。

証明書の取得は、IEなどからファイルに書き出すこともできるのですが、
面倒だと思いますので、この4つの証明書をまとめたものを
http://rrr.jin.gr.jp/dav/NaHi/rsa/rsa-all.pem
に置いておきました。これを適当に手元に置いて、

h = HTTPClient.new
h.ssl_config.set_trust_ca('rsa-all.pem')
h.ssl_config.verify_depth = 4
print h.get_content('https://www.rsasecurity.com')

などとすると、アクセスできます。

# 上でverify_depthを指定しているのは、現在のhttp-access2が、深さ3の
# 階層までしか許さないように設定されてしまっているからです。
# これは明らかに浅すぎますので、次のリリースでOpenSSLのデフォルトに
# 任せるよう、変更します。

信じるべき第三者認証機関は他にもいろいろあり、たとえばVeriSign関係の
証明書をまとめてみた
http://rrr.jin.gr.jp/dav/NaHi/rsa/verisign-all.pem
を使うと、https://www.amazon.comにアクセスできるはずです。


以下余談です。SSL(というか、その下位にあるPKI)において、どの第三者
認証機関を信じるか、というのは大変重要です。いくら暗号化して通信
しても、相手はクレジットカード情報目当てに別人に成りすましている
悪者かもしれません。相手が信じられなければ、暗号化通信はまったく無意味です。

通常使われているブラウザが何も気にせずにSSLできるのは、あなたが信じる
べきである(とブラウザメーカーが思っている)証明書が、デフォルトで
インストールされているからです。あなた(のブラウザ)が誰を信じていることに
なっているか、時々チェックしてみるのもいいかもしれません。