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


110

Я пытаюсь подключить базу данных MySql к Java с помощью коннектора 8.0.11. Вроде все в порядке, но у меня есть исключение:

Исключение в потоке "main" java.sql.SQLNonTransientConnectionException: получение открытого ключа запрещено

Трассировки стека:

    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();
    }
}

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

Ответы:


242

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

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

30
useSSL=false&allowPublicKeyRetrieval=trueэто то , что мне нужно было только тогда , когда я попытался подключения от docker_container1к docker_container2_mysql(where mysql is installed)в моем локальном хосте. Пока от моей хост-машины до docker_container2_mysqlэтого useSSL=falseдостаточно.
прайагупд

1
allowPublicKeyRetrieval = true & amp; useSSL = false, танк, это работает
Мартин Клестиль

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

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

30

Использовать jdbc urlкак:

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

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


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

28

Для пользователей DBeaver :

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

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

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

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

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

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


11

В качестве альтернативы предлагаемым ответам вы можете попробовать использовать плагин аутентификации mysql_native_password вместо плагина аутентификации caching_sha2_password .

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

4

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

1

В моем случае это была ошибка пользователя. Я использовал rootпользователя с неверным паролем. Я не уверен, почему я не получил ошибку аутентификации, а вместо этого получил это загадочное сообщение.


1

Вышеупомянутая ошибка в моем случае была вызвана неправильным именем пользователя и паролем. Решение проблемы: 1. Перейдите в строку DriverManager.getConnection («jdbc: mysql: // localhost: 3306 /? UseSSL = false», «имя пользователя», «пароль»); Поля имя пользователя и пароль могут быть неправильными. Введите имя пользователя и пароль, которые вы используете для запуска клиента mysql. Имя пользователя, как правило, root, а пароль - это строка, которую вы вводите, когда появляется экран, похожий на этот, Начальный экран mysql

Примечание. В вашем случае имя порта 3306 может быть другим.


1

Эта проблема меня расстраивает, потому что вчера я мог взаимодействовать с базой данных, но, вернувшись сегодня утром, я начал получать эту ошибку.

Я попытался добавить allowPublicKeyRetrieval=trueфлаг, но продолжал получать ошибку.

То, что исправлено для меня, было сделано Project->Cleanв Eclipse и Cleanна моем сервере Tomcat. Один (или оба) исправили это.

Я не понимаю почему, потому что я создаю свой проект с помощью Maven и перезагружаю свой сервер после каждого изменения кода. Очень раздражает ...


1

Обновите useSSL = true в подключении приложения весенней загрузки к mysql;

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

1

Я также столкнулся с такой проблемой при докеризации нашего существующего приложения. Решение: добавить параметр подключения MySQL allowPublicKeyRetrieval со значением true в строку подключения JDBC. Если это не работает, попробуйте также добавить параметр useSSL в false .

Результирующая строка будет выглядеть так:

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

0

Это решение работало для MacOS Sierra и работало под управлением MySQL версии 8.0.11. Убедитесь, что драйвер, который вы добавили в путь сборки - «добавить внешнюю банку» должен соответствовать версии SQL.

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

0

Укажите URL-адрес подключения как jdbc: mysql: // localhost: 3306 / hb_student_tracker? AllowPublicKeyRetrieval = true & useSSL = false & serverTimezone = UTC


0

Если при подключении mysql (локального контейнера или контейнера mysql, в котором запущен mysql) возникает следующая ошибка:

java.sql.SQLNonTransientConnectionException: получение открытого ключа запрещено

Решение: добавьте в службу базы данных следующую строку:

command: --default-authentication-plugin=mysql_native_password

0

Прежде всего, убедитесь, что ваш сервер базы данных запущен и работает. Я получал ту же ошибку, попробовав все ответы, перечисленные здесь, я обнаружил, что мой сервер базы данных не работает.

Вы можете проверить то же самое из MySQL Workbench или командной строки, используя

mysql -u USERNAME -p

Это кажется очевидным, но много раз мы предполагаем, что сервер базы данных работает постоянно, особенно когда мы работаем на нашем локальном компьютере, когда мы перезапускаем / выключаем машину, сервер базы данных будет отключен автоматически.


0

Это также может произойти из-за неправильного имени пользователя или пароля. В качестве решений я добавил allowPublicKeyRetrieval=true&useSSL=falseчасть, но все равно получил ошибку, затем я проверил пароль, и он был неправильным.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.