技術的な話

Java / ScalaアプリケーションからMySQLに接続出来ない問題

状況

新しい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以上を使って安全に通信してくださいねとのことです。
普段使用しているライブラリは定期的にアップデートの確認、バージョンアップをしておいた方が良いと感じました。

https://java.com/en/jre-jdk-cryptoroadmap.html

対策

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
https://mvnrepository.com/artifact/mysql/mysql-connector-java

あとは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上のアプリケーションを再起動させると接続できると思います。

-技術的な話
-, , ,