経緯
WebSphere Liberty等、IBM JDKを使ったアプリケーションで、外部のHTTPSサイトにアクセスしようとした際に、サイトによっては次のようなメッセージが出ることがあります。
R javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
R at com.ibm.jsse2.av.a(av.java:599)
R at com.ibm.jsse2.av.i(av.java:869)
R at com.ibm.jsse2.av.a(av.java:19)
R at com.ibm.jsse2.av.startHandshake(av.java:672)
R at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:396)
R at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:355)
R at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:14
一方、Oracle JDKではうまくいくという場合があります。
原因
IBM JDKはデフォルトではTLSv1.0で通信のネゴシエーションをします。一方、相手がTLSv1.2以外を許可しない設定になっている(最近多いです)場合、ネゴシエーションが失敗し、上記のエラーメッセージとなります。
対応
以下の3つのシステムプロパティをセットします。すると、TLSv1.2でネゴシエーションされるようになります。当オプションはJDK 1.8で確認済みです。
jvm.options等
-Dcom.ibm.jsse2.overrideDefaultTLS=true
-Djdk.tls.client.protocols=TLSv1.2
-Dhttps.protocols=TLSv1.2