Ruby-1.8.7_p160 openssl編 その3

test_ssl.rb中のtest_client_authが失敗する件だが、自宅環境で拡張ライブラリィを作り直してテストして見るとエラーが消えてしまった。

仕事場の環境でエラーが出た時のログを見ると

 3) Failure:
test_client_auth(OpenSSL::TestSSL)
    [./openssl/test_ssl.rb:216:in `test_client_auth'
     ./openssl/test_ssl.rb:129:in `call'
     ./openssl/test_ssl.rb:129:in `start_server'
     ./openssl/test_ssl.rb:215:in `test_client_auth']:
 exception expected but was
Class: 

これは以下のコードで発生している。

  • test_ssl.rb test_client_auth
216      assert_raises(OpenSSL::SSL::SSLError){
217        sock = TCPSocket.new("127.0.0.1", port)
218        ssl = OpenSSL::SSL::SSLSocket.new(sock)
219        ssl.connect
220      }

assert_raisesはパラメタに指定した例外がブロック中で発生した場合、その例外を飲み込んで処理を継続するものだが、このとき実際に発生していたのはECONNRESET。自宅ではECONNRESETは発生しなかったということだ。

ではどんな自宅ではどんな例外が発生しているのだろう。SSLErrorだけでは解らないのでコード中で例外を補足してその内容をダンプしてみた。assert_raises中では例外は捨てられるのでスタックトレースからは読めないのだ。

SSL_connect returned=1 errno=0 state=SSLv3 read finished A: sslv3 alert handshake failure

SSL3.0のハンドシェイクに失敗しているらしい。しかしこれは接続が上手くいかないことを証明するテストなので、失敗しているのは構わないのだが、仕事場の環境だけがアサーションに引っかからないのが気になる所だ。

SSLはいろいろな外部要因(ネットワーク、他のソフトウェア、証明書、etc.)が絡むんで、後でHTTPSとか使った時に慌てないように、今のうちに問題は潰しておきたいところ。