JavaでMySQL接続時に発生する「Public Key Retrieval is not allowed」エラーの解決方法

2024-04-02

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


MySQL インデックスの最適化:パフォーマンスを最大限に引き出す

MySQL テーブルにインデックスを追加する には、以下の方法があります。ALTER TABLE ステートメントを使用する例:この例では、customers テーブルに customer_index という名前のインデックスが作成されます。このインデックスは、name 列と email 列に基づいてレコードを検索するために使用できます。...


MySQLで実行中のクエリを安全に停止する方法:リスクと回避策

MySQLで実行中のクエリを停止するには、いくつかの方法があります。方法KILLコマンドKILLコマンドは、指定されたIDのプロセスを強制終了します。プロセスIDは、SHOW PROCESSLISTコマンドで確認できます。mysqladminコマンド...


MySQLデータベースのストレージエンジン選び:InnoDBとXtraDBのメリットとデメリット

InnoDBは、MySQL 5.1からデフォルトのストレージエンジンとして採用されています。 ACIDトランザクション、行レベルロック、外国キー制約など、多くの高度な機能を備えています。XtraDBは、InnoDBをベースに、Percona社によって開発されたストレージエンジンです。 InnoDBの機能に加えて、以下の点で改良されています。...


phpMyAdminで発生する「#1142 - SELECT command denied to user ''@'localhost' for table 'pma_table_uiprefs'」エラーの解決方法

原因このエラーが発生する理由はいくつか考えられます。匿名ユーザーによるアクセス: phpMyAdmin ではデフォルトで、匿名ユーザーによるデータベースへのアクセスが許可されていません。もし、ログインせずに phpMyAdmin を操作している場合は、このエラーが発生します。...


MariaDBでデータベースパフォーマンスを向上させる

MySQLのパフォーマンスが低下する理由は様々ですが、以下が最も一般的な原因です。非効率的なクエリ:WHERE句に適切なインデックスが使用されていない不要なSELECT句が含まれている結合が多すぎるサブクエリが使用されているWHERE句に適切なインデックスが使用されていない...


SQL SQL SQL SQL Amazon で見る



JavaでMySQLに接続する際の「Unable to load authentication plugin 'caching_sha2_password'」エラーの解決策

このエラーは、MySQL 8.0以降とJavaでMySQLに接続する場合によく発生します。MySQL 8.0では、認証プラグインがデフォルトで caching_sha2_password に変更されたため、古いバージョンのJDBCドライバーを使用しているとこのエラーが発生します。