接続Java-MySql:公開鍵の取得は許可されていません


104

コネクタ8.0.11を使用してMySqlデータベースをJavaに接続しようとしています。すべて問題ないようですが、この例外があります。

スレッド「メイン」の例外java.sql.SQLNonTransientConnectionException:公開鍵の取得は許可されていません

スタックトレース:

    Exception in thread "main" java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:108) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at 
 com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:862) at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:444) at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:230) at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:226) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:438) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:146) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:119) at ConnectionManager.getConnection(ConnectionManager.java:28) at Main.main(Main.java:8)

コネクタマネージャ:

public class ConnectionManager {

    public static final String serverTimeZone = "UTC";
    public static final String serverName = "localhost";
    public static final String databaseName ="biblioteka";
    public static final int portNumber = 3306;
    public static final String user = "anyroot";
    public static final String password = "anyroot";

    public static Connection getConnection() throws SQLException {

        MysqlDataSource dataSource = new MysqlDataSource();

        dataSource.setUseSSL( false );
        dataSource.setServerTimezone( serverTimeZone );
        dataSource.setServerName( serverName );
        dataSource.setDatabaseName( databaseName );
        dataSource.setPortNumber( portNumber );
        dataSource.setUser( user );
        dataSource.setPassword( password );

        return dataSource.getConnection();
    }
}

1
コードを入力してください:どのように接続しようとしていますか?例外のスタックトレースも役立ちます。
Sergei Sirik

回答:


226

mysql-connector allowPublicKeyRetrieval=trueにクライアントオプションを追加して、クライアントがサーバーに公開鍵を自動的にリクエストできるようにする必要があります。AllowPublicKeyRetrieval=True悪意のあるプロキシがMITM攻撃を実行して平文パスワードを取得する可能性があることに注意してください。したがって、デフォルトではFalseであり、明示的に有効にする必要があります。

https://mysql-net.github.io/MySqlConnector/connection-options/

useSSL=falseテストや開発の目的で使用する場合は、追加を試すこともできます

例:

jdbc:mysql://localhost:3306/db?allowPublicKeyRetrieval=true&useSSL=false

まあ、これは私にとってはうまくいきましたが、これらのオプションがセキュリティの観点からどれほど合法であるかはわかりません。
Priyank Thakkar

28
useSSL=false&allowPublicKeyRetrieval=trueローカルホストからdocker_container1に接続しようとしたときにだけ必要なものdocker_container2_mysql(where mysql is installed)です。私のホストマシンからdocker_container2_mysqlまでuseSSL=falseは十分です。
prayagupd

1
allowPublicKeyRetrieval = true& useSSL = false、それが機能するタンク
Martin Klestil

2
これが事実である理由を説明できますか?
Capn Sparrow 2018

JDBC接続文字列に「allowPublicKeyRetrieval = true」を追加すると、昨日のWindows 10のアップデート後に開発システムの問題が解決しました。Microsoftが別の穴を塞いだと思います。このオプションは、SSLがオンになっていない私の見解では「開発専用」に使用する必要があります。
Alz

28

jdbc urlとして使用 :

jdbc:mysql://localhost:3306/Database_dbName?allowPublicKeyRetrieval=true&useSSL=false;

PortNo: 3306 構成によって異なる場合があります


ここで小さな修正。接続プロパティ「useSSL」の許容値は、「TRUE」、「FALSE」、「YES」、または「NO」です。値 'false;' 受け入れられません。
bluelurker

25

DBeaverのユーザー:

  1. 接続を右クリックし、「接続の編集」を選択します

  2. 「接続設定」画面(メイン画面)で「ドライバ設定の編集」をクリックします

  3. 「接続プロパティ」をクリックします

  4. [ユーザープロパティ]領域を右クリックし、[新しいプロパティを追加]を選択します

  5. 「useSSL」と「allowPublicKeyRetrieval」の2つのプロパティを追加します

  6. 「値」列をダブルクリックして、値を「false」と「true」に設定します


10

また推奨的回答に、あなたは試してみて、使用することができmysql_native_password認証プラグインの代わりに、caching_sha2_password認証プラグイン。

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password_here'; 

4

Spring Boot Frameworkで以下の設定を使用してこの問題を解決します

spring.datasource.url=jdbc:mysql://localhost:3306/db-name?useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=root

1

私の場合、それはユーザーエラーでした。私が使っていたroot無効なパスワードをユーザに。なぜ認証エラーが発生しなかったのかわかりませんが、代わりにこの不可解なメッセージを受け取りました。


1

私の場合の上記のエラーは、実際には間違ったユーザー名とパスワードが原因でした。問題の解決:1. DriverManager.getConnection( "jdbc:mysql:// localhost:3306 /?useSSL = false"、 "username"、 "password");行に移動します。ユーザー名とパスワードのフィールドが間違っている可能性があります。mysqlクライアントの起動に使用するユーザー名とパスワードを入力します。ユーザー名は通常rootで、パスワードはこのような画面が表示されたときに入力する文字列です。mysqlの起動画面

注:場合によっては、ポート名3306が異なる場合があります。


1

昨日データベースとやり取りできたので、この問題はイライラしましたが、今朝戻ってきた後、このエラーが発生し始めました。

allowPublicKeyRetrieval=trueフラグを追加しようとしましたが、エラーが発生し続けました。

私のためにそれを修正したのはProject->Clean、EclipseとClean私のTomcatサーバーでした。それらの1つ(または両方)が修正しました。

Mavenを使用してプロジェクトをビルドし、コードを変更するたびにサーバーを再起動しているため、理由がわかりません。非常にイライラする...


1

mysqlとのスプリングブートアプリケーション接続でuseSSL = trueを更新します。

jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=true&useLegacyDatetimeCode=false&serverTimezone=UTC

1

既存のアプリケーションをドッキングするときにも、このような問題に直面していました。MySQLのallowPublicKeyRetrieval接続オプションをtrueの値でJDBC接続文字列に追加するソリューションsi 。それが機能しない場合は、useSSLオプションをfalseに追加してみてください。

結果の文字列は次のようになります。

jdbc:mysql://<database server ip>:3306/databaseName?allowPublicKeyRetrieval=true&useSSL=false

0

このソリューションはMacOS Sierraで機能し、MySQLバージョン8.0.11を実行しています。ビルドパスに追加したドライバーを確認してください-「外部jarの追加」はSQLバージョンと一致する必要があります。

String url = "jdbc:mysql://localhost:3306/syscharacterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";

0

接続URLをjdbc:mysql:// localhost:3306 / hb_student_tracker?allowPublicKeyRetrieval = true&useSSL = false&serverTimezone = UTCとして指定します


0

mysql(mysqlを実行しているローカルまたはmysqlコンテナーのいずれか)の接続中に次のエラーが発生した場合:

java.sql.SQLNonTransientConnectionException:公開鍵の取得は許可されていません

解決策:データベースサービスに次の行を追加します。

command: --default-authentication-plugin=mysql_native_password

0

まず、データベースサーバーが稼働中であることを確認してください。ここにリストされているすべての回答を試した後、データベースサーバーが実行されていないことがわかりました。

MySQL Workbenchまたはコマンドラインから同じことを確認できます

mysql -u USERNAME -p

これは明白に聞こえますが、多くの場合、特にローカルマシンで作業している場合、データベースサーバーが常に稼働していると想定しています。マシンを再起動/シャットダウンすると、データベースサーバーが自動的にシャットダウンします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.