やりたいこと
- SpringBoot(2.3.3.RELEASE)で作成されたWebアプリが、ある外部APIに接続する際に、HttpClientがセキュリティ通信方式としてTLSのバージョンのいくつを利用しているのかを調べる
解決できた方法
- 出力するログレベルをDEBUGにした上で実際に通信させたところ、SSLConnectionSocketFactory がログに情報を出力した
解説
HttpClientのバージョン
- 4.5.3
- build.gradle に記述があった
implementation 'org.apache.httpcomponents:httpclient:4.5.3'
- gradleでの記述を検索する際、「HttpClient」「httpClient」みたいに大文字を入れて検索してる間は見つからなかったので全部小文字で検索すべきだった
直面した困難
- 検索したところ、HttpClientが利用するTLSのバージョンの設定方法はヒットするが現在実際にどれを使っているのかの調べ方はヒットしなかった
ログに出るという記述
- 参照 : https://www.fixes.pub/program/90204.html
- 以下のようなログが出るらしい
[DEBUG] SSLConnectionSocketFactory - Enabled protocols: [TLSv1, TLSv1.1, TLSv1.2]
(略)
[DEBUG] SSLConnectionSocketFactory - negotiated protocol: TLSv1.2
↓
* 設定ファイルを編集してDEBUGレベルのログが出力されるように変更し、実際にAPIと通信させたところ、該当のログが表示された
DEBUG o.a.h.c.s.SSLConnectionSocketFactory - Enabled protocols: [TLSv1, TLSv1.1, TLSv1.2]
(略)
DEBUG o.a.h.c.s.SSLConnectionSocketFactory - negotiated protocol: TLSv1.2
クライアント - サーバー間でのTLSバージョンの交渉
- The client sends a list of supported TLS versions.
- The server chooses one and includes the selected version in the response.
- The client and server continue the connection setup using the selected version.
↓
ざっくり解釈すると、
- クライアント → サーバー : サポートしているTLSのバージョンのリストを送る
- サーバー → クライアント : 送られてきたTLSのバージョンからひとつ選びレスポンスする
- クライアント ←→ サーバー : 選択されたTLSバージョンを用いて以降の接続を行う
↓
取得できたログを解釈すると
-
Enabled protocols: [TLSv1, TLSv1.1, TLSv1.2]
→ サポートしているTLSのバージョンのリストを送っている -
negotiated protocol: TLSv1.2
→ 利用するTLSバージョンをTLS1.2として選択している