Connessione Java-MySql: il recupero della chiave pubblica non è consentito


105

Provo a connettere il database MySql con Java utilizzando il connettore 8.0.11. Sembra tutto a posto ma ho questa eccezione:

Eccezione nel thread "main" java.sql.SQLNonTransientConnectionException: recupero della chiave pubblica non consentito

Stack Trace:

    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)

Gestore connettori:

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
Per favore, fornisci un codice: come stai cercando di connetterti. Sarebbe utile anche la traccia dello stack dell'eccezione.
Sergei Sirik

Risposte:


230

Dovresti aggiungere l'opzione client al tuo connettore mysql allowPublicKeyRetrieval=trueper consentire al client di richiedere automaticamente la chiave pubblica dal server. Tieni presente che AllowPublicKeyRetrieval=Truepotrebbe consentire a un proxy dannoso di eseguire un attacco MITM per ottenere la password in chiaro, quindi è False per impostazione predefinita e deve essere esplicitamente abilitato.

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

potresti anche provare ad aggiungere useSSL=falsequando lo usi per scopi di test / sviluppo

esempio:

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

1
Bene, questo ha funzionato per me, ma non sono sicuro di quanto siano legittime queste opzioni dal punto di vista della sicurezza.
Priyank Thakkar

28
useSSL=false&allowPublicKeyRetrieval=trueè ciò di cui avevo bisogno solo quando ho provato a connettermi da docker_container1a docker_container2_mysql(where mysql is installed)all'interno del mio host locale. Mentre dalla mia macchina host a docker_container2_mysql, useSSL=falseè sufficiente.
Prayagupd

1
allowPublicKeyRetrieval = true & amp; useSSL = false, grazie, funziona
Martin Klestil

2
Puoi spiegare perché è così?
Capn Sparrow

L'aggiunta di "allowPublicKeyRetrieval = true" alla stringa di connessione JDBC ha risolto il problema del mio sistema di sviluppo dopo un aggiornamento di Windows 10 di ieri. Immagino che Microsoft abbia tappato un altro buco e che l'opzione dovrebbe essere usata "solo per sviluppo" a mio avviso, dove SSL non è attivato.
Alz

30

Usa jdbc urlcome:

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

PortNo: 3306 può essere diverso nella tua configurazione


Una piccola correzione qui. I valori accettabili della proprietà di connessione "useSSL" sono: "TRUE", "FALSE", "YES" o "NO". Il valore "false;" non è accettabile.
bluelurker

27

Per gli utenti DBeaver :

  1. Fai clic con il pulsante destro del mouse sulla connessione, scegli "Modifica connessione"

  2. Nella schermata "Impostazioni di connessione" (schermata principale) fare clic su "Modifica impostazioni driver"

  3. Fare clic su "Proprietà connessione"

  4. Fai clic con il pulsante destro del mouse sull'area "proprietà utente" e scegli "Aggiungi nuova proprietà"

  5. Aggiungi due proprietà: "useSSL" e "allowPublicKeyRetrieval"

  6. Imposta i loro valori su "false" e "true" facendo doppio clic sulla colonna "value"


10

In alternativa alle risposte suggerite, potresti provare a utilizzare il plug-in di autenticazione mysql_native_password invece del plug-in di autenticazione caching_sha2_password .

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

4

Risolvo questo problema utilizzando la configurazione di seguito sul framework di avvio a molla

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

Nel mio caso è stato un errore dell'utente. Stavo usando l' rootutente con una password non valida. Non sono sicuro del motivo per cui non ho ricevuto un errore di autenticazione, ma invece ho ricevuto questo messaggio criptico.


1

L'errore di cui sopra nel mio caso era in realtà dovuto al nome utente e alla password sbagliati. Risoluzione del problema: 1. Vai alla riga DriverManager.getConnection ("jdbc: mysql: // localhost: 3306 /? UseSSL = false", "username", "password"); I campi nome utente e password potrebbero essere errati. Inserisci il nome utente e la password che usi per avviare il tuo client mysql. Il nome utente è generalmente root e la password è la stringa che inserisci quando viene visualizzata una schermata simile a questa Schermata di avvio di mysql

Nota: il nome della porta 3306 potrebbe essere diverso nel tuo caso.


1

Ho trovato questo problema frustrante perché ieri sono stato in grado di interagire con il database, ma dopo essere tornato questa mattina, ho iniziato a ricevere questo errore.

Ho provato ad aggiungere la allowPublicKeyRetrieval=truebandiera, ma ho continuato a ricevere l'errore.

Ciò che lo ha risolto per me stava facendo Project->Cleanin Eclipse e Cleansul mio server Tomcat. Uno (o entrambi) lo hanno risolto.

Non capisco perché, perché ho creato il mio progetto utilizzando Maven e ho riavviato il mio server dopo ogni modifica del codice. Molto irritante ...


1

Aggiorna useSSL = true nella connessione dell'applicazione di avvio primaverile con mysql;

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

1

Ho anche dovuto affrontare un problema simile durante la dockering della nostra applicazione esistente. La soluzione consiste nell'aggiungere l' opzione di connessione allowPublicKeyRetrieval di MySQL con un valore true alla stringa di connessione JDBC. Se non funziona, prova ad aggiungere anche l' opzione useSSL a false .

La stringa risultante sarebbe simile a questa:

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

0

Questa soluzione ha funzionato per MacOS Sierra e con MySQL versione 8.0.11. Assicurati che il driver che hai aggiunto nel tuo percorso di build - "aggiungi jar esterno" dovrebbe corrispondere alla versione SQL.

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

0

Fornisci l'URL di connessione come jdbc: mysql: // localhost: 3306 / hb_student_tracker? AllowPublicKeyRetrieval = true & useSSL = false & serverTimezone = UTC


0

Se ricevi il seguente errore durante la connessione a mysql (sia locale che mysql che esegue il mysql):

java.sql.SQLNonTransientConnectionException: il recupero della chiave pubblica non è consentito

Soluzione: aggiungi la seguente riga nel tuo servizio di database:

command: --default-authentication-plugin=mysql_native_password

0

Prima di tutto, assicurati che il tuo server database sia attivo e funzionante. Ho ricevuto lo stesso errore, dopo aver provato tutte le risposte elencate qui ho scoperto che il mio server database non era in esecuzione.

Puoi controllare lo stesso da MySQL Workbench o dalla riga di comando usando

mysql -u USERNAME -p

Sembra ovvio, ma molte volte presumiamo che il server database sia sempre attivo e in esecuzione, specialmente quando lavoriamo sulla nostra macchina locale, quando riavviamo / spegniamo la macchina, il server database verrà arrestato automaticamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.