目次
状況
新しいPCが来たのでJava, Scalaの開発環境を整えてみました。
JVM上でScalaアプリケーションを試しに動作させたところ、MySQLに接続する箇所にてjavax.net.ssl.SSLHandshakeException
が発生しました。
色々試行錯誤した結果を下記に記載します。
環境
- Windows10 Pro
- AdoptOpenJDK 8.0.312.7
- mysql-connector-java:5.1.40
scalikejdbc:2.5.0 - MySQL 5.7.xx
原因
どうやらJavaのセキュリティーポリシー的にTLS1.0、TLS1.1プロトコルがデフォルトで無効にされているようです。
ちゃんとTLS1.2以上を使って安全に通信してくださいねとのことです。
普段使用しているライブラリは定期的にアップデートの確認、バージョンアップをしておいた方が良いと感じました。
対策
1.MySQLへの接続時にTLSv1.2を使用するようにする
セキュリティには気を付けようということでキチンとTLSv1.2を使用します。
- mysql-connector-java:5.1.40を5.1.44以上に上げます。(5.1.xx系は古すぎるので8.0.xx系に上げても良いです。)
接続オプション:enabledTLSProtocols
を使用したいため。
mysql-connector-java Release Note - MySQLへの接続時のURLに下記を追加します。
追加オプション)enabledTLSProtocols=TLSv1.2
jdbc:mysql://192.168.1.11/sample_db?characterEncoding=UTF8&enabledTLSProtocols=TLSv1.2
あとはMySQL側もTLSv1.2のみ接続を許可するようにしましょう。ここはお好みで。
MySQLの設定ファイルに下記を追記して再起動します。
[mysqld]
tls_version=TLSv1.2
2.JDKの設定を変更してTLS1.0 or TLS1.1を許可する
あまり推奨されない方法ですが、手っ取り早く接続したい場合はjava.securityファイルを編集する方法を試してみてください。
java.securityファイルの所在(AdoptOpenJDKの場合)C:\Program Files\Eclipse Adoptium\jdk-8.0.312.7-hotspot\jre\lib\security
java.securityファイルのjdk.tls.disabledAlgorithms
項目を編集します。
- 変更前
# Example:
# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
include jdk.disabled.namedCurves
- 変更後
# Example:
# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
include jdk.disabled.namedCurves
変更後にJVM上のアプリケーションを再起動させると接続できると思います。