Соединение Java-MySql: получение открытого ключа запрещено

Я пытаюсь подключить базу данных 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();
    }
}

Пожалуйста, укажите код: как вы пытаетесь подключиться. Также будет полезна трассировка стека исключения.

Sergei Sirik 16.05.2018 23:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
188
1
226 145
17
Перейти к ответу Данный вопрос помечен как решенный

Ответы 17

Ответ принят как подходящий

Вы должны добавить клиентскую опцию к вашему 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

Что ж, у меня это сработало, но я не уверен, насколько законны эти варианты с точки зрения безопасности.

Priyank Thakkar 20.06.2018 09:10
useSSL=false&allowPublicKeyRetrieval=true - это то, что мне нужно, только когда я пытался подключиться с docker_container1 к docker_container2_mysql(where mysql is installed) на моем локальном хосте. В то время как с моей хост-машины на docker_container2_mysql, useSSL=false вполне достаточно.
prayagupd 26.06.2018 07:02

allowPublicKeyRetrieval = true & amp; useSSL = false, танк, это работает

Martin Klestil 02.09.2018 11:34

Вы можете объяснить, почему это так?

Capn Sparrow 07.09.2018 06:45

Добавление allowPublicKeyRetrieval = true в мою строку подключения JDBC решило проблему с моей системой разработки после вчерашнего обновления Windows 10. Думаю, Microsoft заткнула еще одну дыру, и этот вариант, на мой взгляд, следует использовать «только для разработки», когда SSL не включен.

Alz 15.09.2018 15:31

Моя проблема в том, что до вчерашнего дня он работал нормально. Что могло измениться в одночасье?

Sandeep Kumar 31.12.2019 09:14

попробуйте удалить useSSl = false из URL-адреса, который у меня сработал

Saroj Kumar Sahoo 02.05.2020 13:14

Я изо всех сил пытался подключить dbeaver к серверу докеризированныйmysql-8. allowPublicKeyRetrieval=true помог мне: +1:

ira 24.11.2020 08:10

@SandeepKumar То же самое случилось со мной. Вы поняли почему? И да, я знаю, что после того, как вы это прокомментировали, прошло много времени, поэтому у меня нет больших ожиданий :)

Stefan 16.05.2021 17:01

Используйте jdbc url как:

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

PortNo: 3306 может отличаться в вашей конфигурации

Небольшая поправка здесь. Допустимые значения свойства соединения useSSL: TRUE, FALSE, YES или NO. Значение false; не приемлемо.

bluelurker 09.03.2019 19:26

Я решаю эту проблему, используя приведенную ниже конфигурацию в 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

Rajni Gangwar 09.03.2021 13:28

В качестве альтернативы предлагаемым ответам вы можете попробовать использовать плагин аутентификации 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:

  1. Щелкните правой кнопкой мыши ваше соединение и выберите «Редактировать соединение».

  2. На экране «Настройки подключения» (главный экран) нажмите «Редактировать настройки драйвера».

  3. Щелкните "Свойства подключения".

  4. Щелкните правой кнопкой мыши область «Свойства пользователя» и выберите «Добавить новое свойство».

  5. Добавьте два свойства: useSSL и allowPublicKeyRetrieval.

  6. Установите для них значения «ложь» и «истина», дважды щелкнув столбец «значение».

Для меня изменение только поля allowPublicKeyRetrieval в разделе «Свойства драйвера» с False на True помогло. Могу я спросить, зачем добавлять свойство «useSSL», а затем устанавливать для него значение «Ложь»? (Я тоже использую DBeaver)

Sandun 15.12.2020 08:07

В Ubuntu 16.04 я чертовски потратил время на то, чтобы выяснить, как установить значение, потому что визуально оно не показывало ничего, что выглядело бы так, как будто ввод ожидался или записывался. Мне пришлось дважды щелкнуть столбец значений и быть уверенным, что он вводит данные, прежде чем нажимать ввод или щелкать из него, и только тогда появилось значение, которое я ввел.

Stack Underflow 25.02.2021 20:34

Достаточно установить оба свойства в разделе / ​​вкладке Driver properties

Manuel Jordan 29.03.2021 23:38

Попытка подключиться к нестандартной установке mysql в контейнере докеров. Это помогло мне подключиться к базе данных mysql с помощью dbeaver.

Halfstop 20.05.2021 06:32

Я также столкнулся с такой проблемой при докеризации нашего существующего приложения. Решение: добавить параметр подключения 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», а затем:

  • снимите галочку с "Проверять сертификат сервера"
  • установите флажок «Разрешить повторное получение открытого ключа»

Вот как это выглядит. DBeaver configuration

Обратите внимание, что это подходит только для локальной разработки.

это то, что сработало для меня в последней версии DB Beaver

jAC 22.03.2021 17:51

Отлично. Работал с DBeaver версии 21.0.4.

Chandima 16.05.2021 10:33

Setting Server Time Zone to my local place, fixed the issue.


ServerTimeZone

Другие вопросы по теме