it-swarm.com.de

Verbindung Java-MySql: Das Abrufen von öffentlichen Schlüsseln ist nicht zulässig

Ich versuche, die MySql-Datenbank über den Connector 8.0.11 mit Java zu verbinden. Alles scheint in Ordnung zu sein, aber ich habe diese Ausnahme:

Ausnahme im Thread "main" Java.sql.SQLNonTransientConnectionException: Abrufen öffentlicher Schlüssel ist nicht zulässig

Stapelverfolgung:

    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)

Connector Manager:

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();
    }
}
29
danny

Sie sollten Ihrem mysql-Connector eine Clientoption hinzufügen. allowPublicKeyRetrieval=true 

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

könnte helfen, auch useSSL=false hinzuzufügen

77
jtomaszk

Verwenden Sie jdbc url als:

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

PortNo: 3306 kann sich in Ihrer Konfiguration unterscheiden

8
susan097

Ich löse dieses Problem mit der folgenden Konfiguration im 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
2
shellhub

Alternativ zu den vorgeschlagenen Antworten können Sie anstelle von caching_sha2_password authentication plugin auch mysql_native_password authentication plugin verwenden.

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

In meinem Fall war es ein Benutzerfehler. Ich habe den Benutzer root mit einem ungültigen Passwort verwendet. Ich bin nicht sicher, warum ich keinen Auth-Fehler erhalten habe, sondern diese verschlüsselte Nachricht erhalten habe.

1
juice

Diese Lösung funktionierte für MacOS Sierra und die Ausführung von MySQL Version 8.0.11. Stellen Sie sicher, dass der Treiber, den Sie in Ihren Build-Pfad eingefügt haben, mit der SQL-Version übereinstimmt.

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

Geben Sie die Verbindungs-URL als jdbc: mysql: // localhost: 3306/hb_student_tracker? AllowPublicKeyRetrieval = true & useSSL = false & serverTimezone = UTC an

0
samit tiwary

Der obige Fehler in meinem Fall war tatsächlich auf den falschen Benutzernamen und das falsche Passwort zurückzuführen Lösung des Problems: 1. Wechseln Sie in die Zeile DriverManager.getConnection ("jdbc: mysql: // localhost: 3306 /? UseSSL = false", "Benutzername", "Kennwort"); Die Felder Benutzername und Kennwort sind möglicherweise falsch. Geben Sie den Benutzernamen und das Passwort ein, mit denen Sie Ihren MySQL-Client starten. Der Benutzername ist in der Regel root und das Passwort ist die Zeichenfolge, die Sie eingeben, wenn ein ähnlicher Bildschirm angezeigt wird. Startbildschirm von mysql

Hinweis: Der Portname 3306 kann in Ihrem Fall unterschiedlich sein.

0
HARSHIT KUMAR

Ich fand dieses Problem frustrierend, weil ich gestern mit der Datenbank interagieren konnte. Nachdem ich heute Morgen zurückgekommen bin, habe ich diesen Fehler erhalten.

Ich habe versucht, das allowPublicKeyRetrieval=true-Flag hinzuzufügen, erhalte aber weiterhin den Fehler.

Was für mich behoben wurde, war Project->Clean in Eclipse und Clean auf meinem Tomcat-Server. Einer (oder beide) hat das Problem behoben.

Ich verstehe nicht warum, weil ich mein Projekt mit Maven baue und meinen Server nach jeder Codeänderung neu gestartet habe. Sehr irritierend ...

0
Cameron Hudson

Wenn Sie die folgende Fehlermeldung erhalten, während Sie eine Verbindung zu MySQL herstellen (entweder lokaler oder MySQL-Container, in dem MySQL ausgeführt wird):

Java.sql.SQLNonTransientConnectionException: Das Abrufen öffentlicher Schlüssel ist nicht zulässig

Lösung: Fügen Sie die folgende Zeile in Ihren Datenbankdienst ein:

command: --default-authentication-plugin=mysql_native_password
0