お知らせ
2023.12.5(Tue)
目次
こんにちわ。井上です。
家で寛いでいると、突然エラーメールが来ました。システムをリリースした覚えもないのになぜ!? ……と思い、あまり見たことないエラーだったので、少し調べてみました。
今回発生したエラーは以下になります。
Caused by: javax.net.ssl.SSLException: Received fatal alert: protocol_version at sun.security.ssl.Alerts.getSSLException(Alerts.java:208) at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1959) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1077) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323) at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1300) at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338) ...(省略)
バッチシステムから他社システムへ接続してデータを取得するというシステムで発生したエラーになります。
エラーの発生した環境は以下になります。
今回発生したのはバッチシステムだったのですが、実は同じバッチを別環境でも実行しています。そちらでは同じエラーが発生しませんでした。
これが解決へのヒントとなりました。
エラーが発生しなかった環境は以下になります。
エラーの発生した環境と発生しなかった環境を比べると、Javaのバージョンが異なります。JavaのバージョンによってTLSのサポートが異なります。
Java7 | TLS v1 |
---|---|
Java8 | TLS v1.2 |
Java7のままでTLS v1.2を使用することで問題は解決します。バッチの起動時引数に以下の2つを追加しました。
-Dhttps.protocols=TLSv1.2 -Djdk.tls.client.protocols=TLSv1.2
今回のエラーはおそらく相手側のシステムを更新したことによって、弊社側のシステムが動かなくなるというものでした。
Java7もリリースされてからだいぶ経ちました。最新でとは言いませんが、サーバー環境のアップデートも随時必要なのだと感じた一日でした。