MySQL と Confluence の Java 11 との組み合わせで Confluence が開始しない
プラットフォームについて: Server および Data Center のみ。この記事は、Server および Data Center プラットフォームのアトラシアン製品にのみ適用されます。
Support for Server* products ended on February 15th 2024. If you are running a Server product, you can visit the Atlassian Server end of support announcement to review your migration options.
*Fisheye および Crucible は除く
要約
Confluence で Java 11 を使用しており、MySQL データベースに接続している。Confluence を開始すると、MySQL の TLS のサポート対象バージョンに関連し、JDBC URL 経由で渡されるプロトコルとして適切ではない旨の、次のエラーが表示される。
2021-04-26 03:16:06,441 ERROR [Catalina-utility-1] [confluence.impl.setup.DefaultBootstrapDatabaseAccessor] getBootstrapData Unable to open database connection during bootstrap.
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 41 milliseconds ago. The last packet sent successfully to the server was 30 milliseconds ago.
...
Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
環境
- Confluence を Java 11 で実行している
- MySQL 5.7
- Mysql Driver version 5.1.4 or 5.1.34
診断
このエラーは MySQL と TLS プロトコルに関連しているように見受けられ、「MySQL :: MySQL Connector/J 8.0 Developer Guide :: 16 Known Issues and Limitations」で次のように言及されています。
Connector/J では、上位の TLS バージョンを使用するためにコネクションを制限するサーバーに接続するときの互換性の問題のため、デフォルトでは TLS v1.2 以降とのコネクションを有効化しません。com.mysql.cj.exceptions.CJCommunicationsException: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate) が発生する可能性があります。enabledTLSProtocols コネクション プロパティを使用して TLS v1.2 以降のバージョンとのコネクションを有効化する必要があります。詳細についてはセクション 6.8、「Connecting Securely Using SSL」をご確認ください。
Java 11 には、上位レベルのセキュリティと最新の TLS バージョンが同梱します。
サーバー側では、tls_version
システム変数により、MySQL サーバーが暗号化された接続のために許可する TLS プロトコルが定義されます。tls_version
の値は、クライアントからの接続と、ソース/レプリカ レプリケーションを使用しているレプリカ サーバーからの接続に適用されます。変数の値は、この一覧から利用できる、1 つ以上のコンマ区切りのプロトコル バージョンです (大文字と小文字は区別されません)。TLSv1、TLSv1.1、TLSv1.2。デフォルトでは、この変数の一覧には、MySQL のコンパイルに使われる、SSL ライブラリでサポートされるすべてのプロトコル (OpenSSL の場合は TLSv1,TLSv1.1,TLSv1.2
、yaSSL の場合は TLSv1,TLSv1.1
) が含まれます。実行中に tls_version
の値を確認するには、次のステートメントを使用します。
SHOW GLOBAL VARIABLES LIKE '%ssl%';
SHOW GLOBAL VARIABLES LIKE '%tls%';
ソリューション
tls_version
の値を変更するには、サーバーのスタートアップで設定します。たとえば、TLSv1. 1または TLS 1.2 プロトコルを使用するコネクションは許可するが、安全性が比較的低い TLSv1 プロトコルは拒否したい場合、サーバーの my.cnf
ファイルで次の行を使用します。
[mysqld]
tls_version=TLSv1.1,TLSv1.2
Alternatively, we can pass different TLS versions in the JDBC connection URL using enabledTLSProtocols property, like below:
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/confluencedb?enabledTLSProtocols=TLSv1,TLSv1.1,TLSv1.2</property>
Or Just pass the useSSL=false in the connection string like below to disable SSL on the database connection:
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/confluencedb?useSSL=false</property>
Or edit my.cnf and add in skip_ssl
[mysqld]
...
skip_ssl