Połączenie Java-MySql: Pobieranie klucza publicznego jest niedozwolone

109

Próbuję połączyć bazę danych MySql z Javą za pomocą konektora 8.0.11. Wszystko wydaje się być w porządku, ale mam ten wyjątek:

Wyjątek w wątku „main” java.sql.SQLNonTransientConnectionException: pobieranie klucza publicznego jest niedozwolone

Ślad stosu:

    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)

Menedżer oprogramowania sprzęgającego:

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();
    }
}
Danny
źródło
1
Proszę, podaj kod: jak próbujesz się połączyć. Pomocne byłoby również śledzenie stosu wyjątku.
Siergiej Sirik

Odpowiedzi:

241

Powinieneś dodać opcję klienta do twojego mysql-łącznika, allowPublicKeyRetrieval=trueaby umożliwić klientowi automatyczne żądanie klucza publicznego z serwera. Należy pamiętać, że AllowPublicKeyRetrieval=Truemoże to pozwolić złośliwemu serwerowi proxy na wykonanie ataku MITM w celu uzyskania hasła w postaci zwykłego tekstu, więc domyślnie jest ono fałszywe i musi być jawnie włączone.

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

możesz także spróbować dodać, useSSL=falsegdy używasz go do celów testowych / programistycznych

przykład:

jdbc:mysql://localhost:3306/db?allowPublicKeyRetrieval=true&useSSL=false
jtomaszk
źródło
1
Cóż, to zadziałało, ale nie jestem pewien, jak uzasadnione są te opcje z punktu widzenia bezpieczeństwa.
Priyank Thakkar
30
useSSL=false&allowPublicKeyRetrieval=truejest to, co potrzebne tylko wtedy, gdy próbowałem z podłączeniem docker_container1do docker_container2_mysql(where mysql is installed)w moim lokalnego hosta. Wystarczy docker_container2_mysql, useSSL=falseże z mojej maszyny hosta .
prayagupd
1
allowPublicKeyRetrieval = true & amp; useSSL = false, czołg, że to działa
Martin Klestil
2
Czy możesz wyjaśnić, dlaczego tak jest?
Capn Sparrow,
Dodanie „allowPublicKeyRetrieval = true” do moich parametrów połączenia JDBC rozwiązało problem z moim systemem programistycznym po wczorajszej aktualizacji systemu Windows 10. Domyślam się, że Microsoft założył kolejną dziurę i moim zdaniem opcja powinna być używana „tylko do programowania”, gdzie SSL nie jest włączony.
Alz
30

Użyj jdbc urljako:

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

PortNo: 3306 może różnić się w Twojej konfiguracji

susan097
źródło
Tutaj mała korekta. Dopuszczalne wartości właściwości połączenia „useSSL” to: „TRUE”, „FALSE”, „YES” lub „NO”. Wartość „false”; Jest nie do przyjęcia.
bluelurker
27

Dla użytkowników DBeaver :

  1. Kliknij połączenie prawym przyciskiem myszy i wybierz „Edytuj połączenie”

  2. Na ekranie „Ustawienia połączenia” (ekran główny) kliknij „Edytuj ustawienia sterownika”

  3. Kliknij „Właściwości połączenia”

  4. Kliknij prawym przyciskiem myszy obszar „Właściwości użytkownika” i wybierz „Dodaj nową właściwość”

  5. Dodaj dwie właściwości: „useSSL” i „allowPublicKeyRetrieval”

  6. Ustaw ich wartości na „fałsz” i „prawda”, klikając dwukrotnie kolumnę „wartość”

Javier Aviles
źródło
11

Alternatywnie do sugerowanych odpowiedzi możesz spróbować użyć wtyczki uwierzytelniania mysql_native_password zamiast wtyczki uwierzytelniającej caching_sha2_password .

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password_here'; 
Torsten Ojaperv
źródło
4

Rozwiązuję ten problem za pomocą poniższej konfiguracji w ramach rozruchu sprężynowego

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
shellhub
źródło
1

W moim przypadku był to błąd użytkownika. Używałem rootużytkownika z nieprawidłowym hasłem. Nie jestem pewien, dlaczego nie otrzymałem błędu uwierzytelniania, ale zamiast tego otrzymałem tę tajemniczą wiadomość.

sok
źródło
1

Powyższy błąd w moim przypadku był spowodowany niewłaściwą nazwą użytkownika i hasłem. Rozwiązywanie problemu: 1. Przejdź do wiersza DriverManager.getConnection ("jdbc: mysql: // localhost: 3306 /? UseSSL = false", "nazwa użytkownika", "hasło"); Nazwa użytkownika i hasło w polach mogą być nieprawidłowe. Wprowadź nazwę użytkownika i hasło, których używasz do uruchomienia klienta mysql. Nazwa użytkownika to zazwyczaj root, a hasło to ciąg, który wpisujesz, gdy pojawi się ekran podobny do tego Ekran startowy mysql

Uwaga: w Twoim przypadku nazwa portu 3306 może być inna.

riseStark
źródło
1

Ten problem był frustrujący, ponieważ wczoraj mogłem wejść w interakcję z bazą danych, ale po powrocie dziś rano zacząłem otrzymywać ten błąd.

Próbowałem dodać allowPublicKeyRetrieval=trueflagę, ale ciągle otrzymywałem błąd.

Naprawiło to, że robiłem to Project->Cleanw Eclipse i Cleanna moim serwerze Tomcat. Jeden (lub oba) z nich naprawił problem.

Nie rozumiem dlaczego, ponieważ buduję swój projekt przy użyciu Mavena i restartuję serwer po każdej zmianie kodu. Bardzo irytujące ...

Cameron Hudson
źródło
1

Zaktualizuj useSSL = true podczas wiosennego połączenia aplikacji za pomocą mysql;

jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=true&useLegacyDatetimeCode=false&serverTimezone=UTC
Bheem Singh
źródło
1

Miałem również do czynienia z takim problemem podczas dokowania naszej istniejącej aplikacji. Rozwiązaniem jest dodanie opcji połączenia allowPublicKeyRetrieval MySQL z wartością true do ciągu połączenia JDBC. Jeśli to nie działa, spróbuj również dodać opcję useSSL do wartości false .

Wynikowy ciąg wyglądałby następująco:

jdbc:mysql://<database server ip>:3306/databaseName?allowPublicKeyRetrieval=true&useSSL=false
Arun s
źródło
0

To rozwiązanie działało na MacOS Sierra i MySQL w wersji 8.0.11. Upewnij się, że sterownik, który dodałeś w ścieżce kompilacji - „dodaj zewnętrzny jar” powinien być zgodny z wersją SQL.

String url = "jdbc:mysql://localhost:3306/syscharacterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
surendrapanday
źródło
0

Podaj URL połączenia jako jdbc: mysql: // localhost: 3306 / hb_student_tracker? AllowPublicKeyRetrieval = true & useSSL = false & serverTimezone = UTC

samit tiwary
źródło
0

Jeśli otrzymujesz następujący błąd podczas łączenia się z mysql (kontenerem lokalnym lub mysql z uruchomionym mysql):

java.sql.SQLNonTransientConnectionException: Pobieranie klucza publicznego jest niedozwolone

Rozwiązanie: dodaj następujący wiersz do usługi bazy danych:

command: --default-authentication-plugin=mysql_native_password
Rohtash Singh Lakra
źródło
0

Przede wszystkim upewnij się, że serwer bazy danych jest uruchomiony i działa. Otrzymałem ten sam błąd, po wypróbowaniu wszystkich odpowiedzi wymienionych tutaj stwierdziłem, że mój serwer bazy danych nie działa.

Możesz sprawdzić to samo w MySQL Workbench lub linii poleceń za pomocą

mysql -u USERNAME -p

Wydaje się to oczywiste, ale wiele razy zakładamy, że serwer bazy danych jest uruchomiony i działa cały czas, zwłaszcza gdy pracujemy na naszej lokalnej maszynie, gdy ponownie uruchamiamy / zamykamy maszynę, serwer bazy danych zostanie automatycznie wyłączony.

Vinod Kumar KV
źródło
0

Może się to również zdarzyć z powodu złej nazwy użytkownika lub hasła. Jako rozwiązania dodałem allowPublicKeyRetrieval=true&useSSL=falseczęść, ale nadal mam błąd, po czym sprawdziłem hasło i było złe.

HashanR
źródło