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();
}
}
Odpowiedzi:
Powinieneś dodać opcję klienta do twojego mysql-łącznika,
allowPublicKeyRetrieval=true
aby umożliwić klientowi automatyczne żądanie klucza publicznego z serwera. Należy pamiętać, żeAllowPublicKeyRetrieval=True
moż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=false
gdy używasz go do celów testowych / programistycznychprzykład:
źródło
useSSL=false&allowPublicKeyRetrieval=true
jest to, co potrzebne tylko wtedy, gdy próbowałem z podłączeniemdocker_container1
dodocker_container2_mysql(where mysql is installed)
w moim lokalnego hosta. Wystarczydocker_container2_mysql
,useSSL=false
że z mojej maszyny hosta .Użyj
jdbc url
jako:PortNo: 3306
może różnić się w Twojej konfiguracjiźródło
Dla użytkowników DBeaver :
Kliknij połączenie prawym przyciskiem myszy i wybierz „Edytuj połączenie”
Na ekranie „Ustawienia połączenia” (ekran główny) kliknij „Edytuj ustawienia sterownika”
Kliknij „Właściwości połączenia”
Kliknij prawym przyciskiem myszy obszar „Właściwości użytkownika” i wybierz „Dodaj nową właściwość”
Dodaj dwie właściwości: „useSSL” i „allowPublicKeyRetrieval”
Ustaw ich wartości na „fałsz” i „prawda”, klikając dwukrotnie kolumnę „wartość”
źródło
Alternatywnie do sugerowanych odpowiedzi możesz spróbować użyć wtyczki uwierzytelniania mysql_native_password zamiast wtyczki uwierzytelniającej caching_sha2_password .
źródło
Rozwiązuję ten problem za pomocą poniższej konfiguracji w ramach rozruchu sprężynowego
źródło
W moim przypadku był to błąd użytkownika. Używałem
root
użytkownika z nieprawidłowym hasłem. Nie jestem pewien, dlaczego nie otrzymałem błędu uwierzytelniania, ale zamiast tego otrzymałem tę tajemniczą wiadomość.źródło
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.
źródło
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=true
flagę, ale ciągle otrzymywałem błąd.Naprawiło to, że robiłem to
Project->Clean
w Eclipse iClean
na 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 ...
źródło
Zaktualizuj useSSL = true podczas wiosennego połączenia aplikacji za pomocą mysql;
źródło
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:
źródło
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.
źródło
Podaj URL połączenia jako jdbc: mysql: // localhost: 3306 / hb_student_tracker? AllowPublicKeyRetrieval = true & useSSL = false & serverTimezone = UTC
źródło
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:
źródło
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ą
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.
źródło
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=false
część, ale nadal mam błąd, po czym sprawdziłem hasło i było złe.źródło