JavaでMySQL接続時に発生する「Public Key Retrieval is not allowed」エラーの解決方法
JavaでMySQLに接続する際、「Public Key Retrieval is not allowed」というエラーが発生した場合の解決方法
症状
java.sql.SQLException: Public Key Retrieval is not allowed
原因
このエラーは、MySQLサーバーがクライアントからの公開鍵の取得を許可していないために発生します。
解決方法
このエラーを解決するには、以下の方法があります。
MySQLサーバーの設定ファイル /etc/mysql/my.cnf
を編集し、public_key_retrieval
の値を 1
に変更します。
[mysqld]
...
public_key_retrieval = 1
...
クライアントプログラムにオプションを指定する
DriverManager.getConnection()
メソッドに useSSL=false
オプションを指定して、SSL接続を無効化します。
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/database",
"username",
"password",
new Properties() {{
setProperty("useSSL", "false");
}}
);
パスワード認証を使用する
公開鍵認証ではなく、パスワード認証を使用する場合は、jdbc:mysql://.../?useSSL=false&allowPublicKeyRetrieval=true
のように allowPublicKeyRetrieval=true
オプションを指定します。
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/database?useSSL=false&allowPublicKeyRetrieval=true",
"username",
"password"
);
JDBCドライバのバージョンを確認する
古いバージョンのJDBCドライバを使用している場合、このエラーが発生する可能性があります。最新バージョンのJDBCドライバを使用していることを確認してください。
上記の方法を試しても問題が解決しない場合は、以下の点を確認してください。
- MySQLサーバーとクライアントプログラムのバージョンが互換性があることを確認してください。
- MySQLサーバーが起動していることを確認してください。
- ネットワーク接続に問題がないことを確認してください。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) throws SQLException {
// 接続情報
String url = "jdbc:mysql://localhost:3306/database";
String username = "username";
String password = "password";
// オプションの設定
Properties properties = new Properties();
properties.setProperty("useSSL", "false");
// 接続
Connection connection = DriverManager.getConnection(url, username, password, properties);
// 処理
// ...
// 接続のクローズ
connection.close();
}
}
- 接続情報 (URL、ユーザー名、パスワード) は、ご自身の環境に合わせて変更してください。
補足
- このサンプルコードは、パスワード認証を使用する例です。公開鍵認証を使用する場合は、
useSSL=false
オプションの代わりにallowPublicKeyRetrieval=true
オプションを指定してください。
SSHトンネルを使用して、ローカルマシンとMySQLサーバー間の通信を暗号化します。
VPNを使用して、ローカルマシンとMySQLサーバー間の通信を安全なネットワーク経由で送信します。
Cloud SQLを使用する
Google Cloud Platformなどのクラウドサービスで提供される Cloud SQL を使用すれば、安全なデータベース接続を実現することができます。
注意点
上記の方法はいずれも、セキュリティ上のリスクを伴う可能性があります。これらの方法を使用する前に、リスクを十分に理解した上で、適切な対策を講じる必要があります。
java mysql exception