Ich versuche, MySQL-Datenbank mit Java über Connector 8.0.11 zu verbinden. Alles scheint in Ordnung zu sein, aber ich habe diese Ausnahme:
Ausnahme im Thread "main" java.sql.SQLNonTransientConnectionException: Das 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();
}
}
Antworten:
Sie sollten Ihrem MySQL-Connector
allowPublicKeyRetrieval=true
eine Client-Option hinzufügen , damit der Client den öffentlichen Schlüssel automatisch vom Server anfordern kann. Beachten Sie,AllowPublicKeyRetrieval=True
dass ein böswilliger Proxy möglicherweise einen MITM-Angriff ausführen kann, um das Klartextkennwort abzurufen. Daher ist es standardmäßig falsch und muss explizit aktiviert werden.https://mysql-net.github.io/MySqlConnector/connection-options/
Sie können auch versuchen, etwas hinzuzufügen,
useSSL=false
wenn Sie es zu Test- / Entwicklungszwecken verwendenBeispiel:
quelle
useSSL=false&allowPublicKeyRetrieval=true
ist das, was ich nur brauchte, als ich versuchte, eine Verbindung vondocker_container1
zudocker_container2_mysql(where mysql is installed)
meinem lokalen Host herzustellen . Während von meinem Host-Computer zudocker_container2_mysql
,useSSL=false
ist genug.Verwendung
jdbc url
als:PortNo: 3306
kann in Ihrer Konfiguration unterschiedlich seinquelle
Für DBeaver- Benutzer:
Klicken Sie mit der rechten Maustaste auf Ihre Verbindung und wählen Sie "Verbindung bearbeiten".
Klicken Sie im Bildschirm "Verbindungseinstellungen" (Hauptbildschirm) auf "Treibereinstellungen bearbeiten".
Klicken Sie auf "Verbindungseigenschaften"
Klicken Sie mit der rechten Maustaste auf den Bereich "Benutzereigenschaften" und wählen Sie "Neue Eigenschaft hinzufügen".
Fügen Sie zwei Eigenschaften hinzu: "useSSL" und "allowPublicKeyRetrieval"
Setzen Sie ihre Werte auf "false" und "true", indem Sie auf die Spalte "value" doppelklicken
quelle
Alternativ zu den vorgeschlagenen Antworten können Sie versuchen, das Authentifizierungs-Plugin mysql_native_password anstelle des Authentifizierungs-Plugins caching_sha2_password zu verwenden .
quelle
Ich löse dieses Problem mithilfe der folgenden Konfiguration des Spring Boot Frameworks
quelle
In meinem Fall war es ein Benutzerfehler. Ich habe den
root
Benutzer mit einem ungültigen Passwort verwendet. Ich bin nicht sicher, warum ich keinen Authentifizierungsfehler erhalten habe, sondern diese kryptische Nachricht erhalten habe.quelle
Der obige Fehler in meinem Fall war tatsächlich auf den falschen Benutzernamen und das falsche Passwort zurückzuführen. Beheben des Problems: 1. Gehen Sie zur Zeile DriverManager.getConnection ("jdbc: mysql: // localhost: 3306 /? UseSSL = false", "Benutzername", "Passwort"); Die Felder Benutzername und Passwort sind möglicherweise falsch. Geben Sie den Benutzernamen und das Passwort ein, mit denen Sie Ihren MySQL-Client starten. Der Benutzername ist im Allgemeinen 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.
quelle
Ich fand dieses Problem frustrierend, weil ich gestern mit der Datenbank interagieren konnte, aber nachdem ich heute Morgen zurückgekommen war, bekam ich diesen Fehler.
Ich habe versucht, das hinzuzufügen
allowPublicKeyRetrieval=true
Flag , aber ich habe immer wieder den Fehler erhalten.Was es für mich behoben hat, war
Project->Clean
in Eclipse undClean
auf meinem Tomcat-Server. Einer (oder beide) von denen haben es behoben.Ich verstehe nicht warum, weil ich mein Projekt mit Maven erstelle und meinen Server nach jeder Codeänderung neu starte. Sehr irritierend ...
quelle
Aktualisieren Sie die Verbindung useSSL = true in der Spring-Boot-Anwendung mit mysql.
quelle
Ich war auch mit einem solchen Problem konfrontiert, als ich unsere vorhandene Anwendung angedockt habe. Die Lösung besteht darin, die Verbindungsoption allowPublicKeyRetrieval von MySQL mit dem Wert true zur JDBC-Verbindungszeichenfolge hinzuzufügen . Wenn das nicht funktioniert, versuchen Sie , useSSL Option falsch als auch.
Die resultierende Zeichenfolge würde folgendermaßen aussehen:
quelle
Diese Lösung funktionierte unter MacOS Sierra und unter MySQL Version 8.0.11. Stellen Sie sicher, dass der Treiber, den Sie in Ihrem Build-Pfad hinzugefügt haben - "Add external jar" mit der SQL-Version übereinstimmen sollte.
quelle
Geben Sie die Verbindungs-URL als jdbc: mysql: // localhost: 3306 / hb_student_tracker an? PermitPublicKeyRetrieval = true & useSSL = false & serverTimezone = UTC
quelle
Wenn beim Verbinden der MySQL die folgende Fehlermeldung angezeigt wird (entweder lokaler oder MySQL-Container, in dem die MySQL ausgeführt wird):
java.sql.SQLNonTransientConnectionException: Das Abrufen öffentlicher Schlüssel ist nicht zulässig
Lösung: Fügen Sie Ihrem Datenbankdienst die folgende Zeile hinzu:
quelle
Stellen Sie zunächst sicher, dass Ihr Datenbankserver betriebsbereit ist. Ich habe den gleichen Fehler erhalten, nachdem ich alle hier aufgeführten Antworten ausprobiert hatte, stellte ich fest, dass mein Datenbankserver nicht ausgeführt wurde.
Sie können dies auch über die MySQL Workbench oder die Befehlszeile mit überprüfen
Dies klingt offensichtlich, aber wir gehen oft davon aus, dass der Datenbankserver ständig in Betrieb ist, insbesondere wenn wir an unserem lokalen Computer arbeiten. Wenn wir den Computer neu starten / herunterfahren, wird der Datenbankserver automatisch heruntergefahren.
quelle