MechanizeがTLS1.0とTLS1.1を無効化したサーバーと通信できるどうかの確認

利用しているAPIでTLS1.0とTLS1.1を無効にするという告知が来たので、そうしたAPIを使っているRubyの処理に問題が無いかどうかを確認する。

TLS1.0とTLS1.1を無効にしたサーバーを自前で用意し、それにまずはOpenSSLで

openssl s_client -tls1 -connect www.example.com:443 -showcerts
openssl s_client -tls1_1 -connect www.example.com:443 -showcerts
openssl s_client -tls1_2 -connect www.example.com:443 -showcerts

TLS1.0とTLS1.1は無効化されているのでTLSv1.2を使った時だけ証明書の内容が表示される。
(どの場合も証明書が表示される場合はTLS1.0とTLS1.1が有効なので、用意したサーバーの設定をミスっている)

さてプログラム内ではMechanizeを使っているので、この状態で以下のようにして普通にコンテンツを取得できればOK。

irb(main):001:0> agent = Mechanize.new
=> #<Mechanize:0x00...
irb(main):002:0> agent.get 'https://www.example.com'
=> #<Mechanize::Page...

念のためssl_versionにTLSv1とTLSv1_1を指定して通信できないことも確かめる。

irb(main):040:0> agent.ssl_version = 'TLSv1'
=> "TLSv1"
irb(main):041:0> agent.get 'https://www.example.com'
Errno::ECONNRESET: Connection reset by peer - SSL_connect

irb(main):042:0> agent.ssl_version = 'TLSv1_1'
=> "TLSv1_1"
irb(main):043:0> agent.get 'https://www.example.com'
Errno::ECONNRESET: Connection reset by peer - SSL_connect

最後にTSLv1_2を指定して問題なく通信できることを確かめる。

irb(main):044:0> agent.ssl_version = 'TLSv1_2'
=> "TLSv1_2"
irb(main):045:0> agent.get 'https://www.example.com'
=> #<Mechanize::Page...

TLSv1_2ではなくTLSv1.2と指定すると次のようなエラーになってしまうので注意。

irb(main):046:0> agent.ssl_version = 'TLSv1.2'
=> "TLSv1.2"
irb(main):047:0> agent.get 'https://www.example.com'
ArgumentError: unknown SSL method `TLSv1.2'.