Vine Linux 3.2 で、 Ruby で net/https を使ってはてなにアクセスしようとしてもエラーになる。例えば、 Ruby リファレンスマニュアル の net/https のページにある次のコードは、実際に実行するとエラーが出る:
$ cat ssl.rb #!/usr/bin/env ruby require 'net/https' https = Net::HTTP.new('www.hatena.ne.jp', 443) https.use_ssl = true https.ca_file = '/usr/share/ssl/cert.pem' https.verify_mode = OpenSSL::SSL::VERIFY_PEER https.verify_depth = 5 https.start { |w| response = w.get('/login') puts response.body } $ ./ssl.rb /usr/lib/ruby/1.8/net/protocols.rb:49:in `connect': certificate verify failed (OpenSSL::SSL::SSLError) from /usr/lib/ruby/1.8/net/protocols.rb:49:in `ssl_connect' from /usr/lib/ruby/1.8/net/https.rb:181:in `on_connect' from /usr/lib/ruby/1.8/net/http.rb:433:in `do_start' from /usr/lib/ruby/1.8/net/http.rb:419:in `start' from ./ssl.rb:10
これは、はてなの使っている認証局 (Equifax Secure eBusiness CA-1) が、認証局証明書リスト /usr/share/ssl/cert.pem *1 に登録されていない *2 ため。
対処法はいくつか考えられるが、アクセスするサイトが例えばはてなだけなら、単に https.ca_file に Equifax Secure eBusiness CA-1 の認証局証明書ファイルを指定すればよい。
http://www.geotrust.co.jp/ssl_help/sonota1.html から Equifax Secure eBusiness CA-1 の認証局証明書をダウンロードし、 https.ca_file の指定部分を次のようにする。
https.ca_file = './Equifax_Secure_eBusiness_CA-1.cer'
配布をするようなスクリプトなら、この方法が証明書のサイズも小さくて便利だろう。
根本的 (?) な解決法としては、古い証明書リストをより新しいもので置きかえてしまう、という方法がある。詳しくは以下のトピックで。
*1:/usr/share/ssl/certs/ca-bundle.crt への symbolic link
*2:Vine Linux の場合、 openssl 0.9.7d-0vl3.2 パッケージに入っている /usr/share/ssl/certs/ca-bundle.crt に含まれていない。これは 2000/10/25 のもの