Я пытаюсь подключить базу данных MySql к Java с помощью коннектора 8.0.11. Кажется, все в порядке, но у меня есть исключение:
Exception in thread "main" java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed
Трассировки стека:
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)
Диспетчер коннекторов:
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();
}
}




Вы должны добавить клиентскую опцию к вашему mysql-коннектору allowPublicKeyRetrieval=true, чтобы позволить клиенту автоматически запрашивать открытый ключ с сервера. Обратите внимание, что AllowPublicKeyRetrieval=True может позволить вредоносному прокси-серверу выполнить MITM-атаку для получения пароля в виде открытого текста, поэтому по умолчанию он имеет значение False и должен быть явно включен.
https://mysql-net.github.io/MySqlConnector/connection-options/
вы также можете попробовать добавить useSSL=false, когда используете его для тестирования / разработки
пример:
jdbc:mysql://localhost:3306/db?allowPublicKeyRetrieval=true&useSSL=false
Что ж, у меня это сработало, но я не уверен, насколько законны эти варианты с точки зрения безопасности.
useSSL=false&allowPublicKeyRetrieval=true - это то, что мне нужно, только когда я пытался подключиться с docker_container1 к docker_container2_mysql(where mysql is installed) на моем локальном хосте. В то время как с моей хост-машины на docker_container2_mysql, useSSL=false вполне достаточно.
allowPublicKeyRetrieval = true & amp; useSSL = false, танк, это работает
Вы можете объяснить, почему это так?
Добавление allowPublicKeyRetrieval = true в мою строку подключения JDBC решило проблему с моей системой разработки после вчерашнего обновления Windows 10. Думаю, Microsoft заткнула еще одну дыру, и этот вариант, на мой взгляд, следует использовать «только для разработки», когда SSL не включен.
Моя проблема в том, что до вчерашнего дня он работал нормально. Что могло измениться в одночасье?
попробуйте удалить useSSl = false из URL-адреса, который у меня сработал
Я изо всех сил пытался подключить dbeaver к серверу докеризированныйmysql-8. allowPublicKeyRetrieval=true помог мне: +1:
@SandeepKumar То же самое случилось со мной. Вы поняли почему? И да, я знаю, что после того, как вы это прокомментировали, прошло много времени, поэтому у меня нет больших ожиданий :)
Используйте jdbc url как:
jdbc:mysql://localhost:3306/Database_dbName?allowPublicKeyRetrieval=true&useSSL=false;
PortNo: 3306 может отличаться в вашей конфигурации
Небольшая поправка здесь. Допустимые значения свойства соединения useSSL: TRUE, FALSE, YES или NO. Значение false; не приемлемо.
Я решаю эту проблему, используя приведенную ниже конфигурацию в 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
правильно, самым простым может быть ваш локальный пароль mysql, который отличается от того, что настроено в application.properties ... проверьте и измените его. Так было с mw
В качестве альтернативы предлагаемым ответам вы можете попробовать использовать плагин аутентификации mysql_native_password вместо плагина аутентификации caching_sha2_password.
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password_here';
Это решение работало для MacOS Sierra и работало под управлением MySQL версии 8.0.11. Убедитесь, что драйвер, который вы добавили в свой путь сборки - «добавить внешнюю банку» должен совпадать с версией SQL.
String url = "jdbc:mysql://localhost:3306/syscharacterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
В моем случае это была ошибка пользователя. Я использовал пользователя root с неверным паролем. Я не уверен, почему я не получил ошибку аутентификации, а вместо этого получил это загадочное сообщение.
Вышеупомянутая ошибка в моем случае на самом деле была связана с неправильным именем пользователя и паролем. Решение вопроса: 1. Перейдите в строку DriverManager.getConnection («jdbc: mysql: // localhost: 3306 /? UseSSL = false», «имя пользователя», «пароль»); Поля имя пользователя и пароль могут быть неправильными. Введите имя пользователя и пароль, которые вы используете для запуска клиента mysql. Имя пользователя, как правило, root, а пароль - это строка, которую вы вводите, когда появляется экран, похожий на этот Экран запуска mysql
Примечание. В вашем случае имя порта 3306 может быть другим.
Я нашел эту проблему расстраивающей, потому что вчера я мог взаимодействовать с базой данных, но, вернувшись сегодня утром, я начал получать эту ошибку.
Я попытался добавить флаг allowPublicKeyRetrieval=true, но продолжал получать ошибку.
Для меня это исправило выполнение Project->Clean в Eclipse и Clean на моем сервере Tomcat. Один (или оба) исправили это.
Я не понимаю почему, потому что я создаю свой проект с помощью Maven и перезагружаю свой сервер после каждого изменения кода. Очень раздражает ...
Укажите URL-адрес подключения как jdbc: mysql: // localhost: 3306 / hb_student_tracker? allowPublicKeyRetrieval = true и useSSL = false и serverTimezone = UTC
Если при подключении mysql (локального контейнера или контейнера mysql, в котором запущен mysql) возникает следующая ошибка:
java.sql.SQLNonTransientConnectionException: получение открытого ключа запрещено
Решение: Добавьте следующую строку в службу базы данных:
command: --default-authentication-plugin=mysql_native_password
Обновите useSSL = true в подключении приложения весенней загрузки к mysql;
jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=true&useLegacyDatetimeCode=false&serverTimezone=UTC
Для пользователей DBeaver:
Щелкните правой кнопкой мыши ваше соединение и выберите «Редактировать соединение».
На экране «Настройки подключения» (главный экран) нажмите «Редактировать настройки драйвера».
Щелкните "Свойства подключения".
Щелкните правой кнопкой мыши область «Свойства пользователя» и выберите «Добавить новое свойство».
Добавьте два свойства: useSSL и allowPublicKeyRetrieval.
Установите для них значения «ложь» и «истина», дважды щелкнув столбец «значение».
Для меня изменение только поля allowPublicKeyRetrieval в разделе «Свойства драйвера» с False на True помогло. Могу я спросить, зачем добавлять свойство «useSSL», а затем устанавливать для него значение «Ложь»? (Я тоже использую DBeaver)
В Ubuntu 16.04 я чертовски потратил время на то, чтобы выяснить, как установить значение, потому что визуально оно не показывало ничего, что выглядело бы так, как будто ввод ожидался или записывался. Мне пришлось дважды щелкнуть столбец значений и быть уверенным, что он вводит данные, прежде чем нажимать ввод или щелкать из него, и только тогда появилось значение, которое я ввел.
Достаточно установить оба свойства в разделе / вкладке Driver properties
Попытка подключиться к нестандартной установке mysql в контейнере докеров. Это помогло мне подключиться к базе данных mysql с помощью dbeaver.
Я также столкнулся с такой проблемой при докеризации нашего существующего приложения. Решение: добавить параметр подключения MySQL allowPublicKeyRetrieval со значением правда в строку подключения JDBC. Если это не работает, попробуйте также добавить параметр useSSL в ложный.
Результирующая строка будет выглядеть так:
jdbc:mysql://<database server ip>:3306/databaseName?allowPublicKeyRetrieval=true&useSSL=false
Прежде всего, убедитесь, что ваш сервер базы данных запущен и работает. Я получал ту же ошибку, попробовав все ответы, перечисленные здесь, я обнаружил, что мой сервер базы данных не работает.
Вы можете проверить то же самое в MySQL Workbench или в командной строке, используя
mysql -u USERNAME -p
Это кажется очевидным, но много раз мы предполагаем, что сервер базы данных работает постоянно, особенно когда мы работаем на нашем локальном компьютере, когда мы перезагружаем / выключаем машину, сервер базы данных будет отключен автоматически.
Это также может произойти из-за неправильного имени пользователя или пароля.
В качестве решений я добавил часть allowPublicKeyRetrieval=true&useSSL=false, но все же у меня возникла ошибка, после чего я проверил пароль, и он был неправильным.
Когда я делал это из DBeaver, мне пришлось перейти на вкладку «Настройки подключения» -> «SSL», а затем:
Обратите внимание, что это подходит только для локальной разработки.
это то, что сработало для меня в последней версии DB Beaver
Отлично. Работал с DBeaver версии 21.0.4.
Пожалуйста, укажите код: как вы пытаетесь подключиться. Также будет полезна трассировка стека исключения.