Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

Vine Linux 3.2 で net/https を使ってはてなにアクセス

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 のもの