2012年12月2日日曜日

[Ruby] デフォルトの CA 証明書ファイルを変更しても、証明書の検証に失敗する

SSL デフォルトの CA 証明書ファイル名を変更しても証明書の検証に失敗した記録です。
ルート CA 証明書を入手した方法はこちら

require 'open-uri'
require 'openssl'
OpenSSL::X509.module_eval{ remove_const(:DEFAULT_CERT_FILE) }
OpenSSL::X509.const_set( :DEFAULT_CERT_FILE, 'C:/GeoTrust.cer' )
puts open('https://www.google.com/').read

この結果では、まだ証明書の検証に失敗しています。
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

証明書やURLを変えてみても、エラーは一向に終息せず。デバッグにして追跡してみます。
OpenSSL::debug = true

どうやら、これは指定した CA 証明書が使われていない様子。

warning: error on stack: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed (OpenSSL::SSL::SSLError)

手段を変えて、今度は環境変数に定義してみます。
set SSL_CERT_FILE=C:/GeoTrust.cer

require 'open-uri'
require 'openssl'
puts OpenSSL::X509::DEFAULT_CERT_FILE
open('https://www.google.com/').read

!!デフォルトの CA 証明書ファイルは変更されていないが、正常に動作した。!!
リファレンスマニュアルでは、環境変数を設定すれば DEFAULT_CERT_FILE を変更できるような説明になっているのですが・・・どうやら別のものらしいです。
http://doc.ruby-lang.org/ja/1.9.3/method/OpenSSL=3a=3aX509/c/DEFAULT_CERT_FILE.html

libのソースを検索しても、該当箇所がなかなか見つからなかったので、調査は打ち切りました。


デフォルトの CA 証明書ディレクトリの変更についても、恐らく同じ状況なのだと思います。
OpenSSL::X509::DEFAULT_CERT_DIR