
TLSv1.2への移行
利用しているAPIがTLSv1.2へ移行するとのことで、クライアント側がTLSv1.2で通信可能かどうか確認してくださいと連絡をもらいました。
APIにアクセスしているのはrest-client(2.1.0)でした。なのでrest-clientがアクセスする際に利用するTLSのバージョンを確認すればよいことになります。
TLSのバージョン取得方法
ググってみるとopensslのドキュメントが見つかりました
https://www.openssl.org/docs/man1.1.1/man3/SSL_get_version.html
いろんな種類があるようです。
rest-clientの場合
rest-clientはリクエストを作成する場合にNet::HTTPを利用します。
https://github.com/rest-client/rest-client/blob/master/lib/restclient/request.rb#L163
https://github.com/rest-client/rest-client/blob/master/lib/restclient/request.rb#L464
Net::HTTPが利用するTLSのバージョンを知るためにgithubでコードを確認してみます。
https://github.com/ruby/net-http/blob/master/lib/net/http.rb#L975
https://github.com/ruby/net-http/blob/master/lib/net/http.rb#L1030
ここでsocketの生成を行なっています
https://github.com/ruby/net-http/blob/master/lib/net/http.rb#L1044
@socketを作成しています。Net::BufferedIO.newの引数で先ほど作成したsocketを指定しています。
BufferedIOを確認すると、#ioというメソッドがあり、オブジェクトを返してくれるということです。
Module#prependで試してみる
Module#prependを使って実際に出力してみます。
処理を入れるところはsocketをクローズする手前のdo_finishメソッドにします。
https://github.com/ruby/net-http/blob/master/lib/net/http.rb#L1069
まずは@socketを確認してみます。
1 | $ rails c |
ioというOpenSSL::SSL::SSLSocketクラスのインスタンスがあります。ioの中身を確認します。
1 | [1] pry(main)> Net::HTTP.prepend Module.new { def do_finish; pp @socket.io; super; end } |
OpenSSL::SSL::SSLContextのインスタンスの@contextから取得できそうです。
1 | [1] pry(main)> Net::HTTP.prepend Module.new { def do_finish; pp @socket.io.context.ssl_version; super; end } |
ん〜ダメでした。setterのみのようです。
ためしにmethodメソッドを利用してみます。
1 | [1] pry(main)> Net::HTTP.prepend Module.new { def do_finish; pp @socket.io.method(:ssl_version); super; end } |
ssl_versionがかえってきています。ということは呼び出せるということですね。
1 | [1] pry(main)> Net::HTTP.prepend Module.new { def do_finish; pp @socket.io.ssl_version; super; end } |
無事バージョンが取得できました!
まとめ
RailsのRestClientで利用しているTLSのバージョンを確認するにはrails consoleで
1 | Net::HTTP.prepend Module.new { def do_finish; pp @socket.io.ssl_version; super; end } |
を実行してからRestClient.getでリクエストを送る。