Я пытаюсь подключить базу данных 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();
}
}
Ответы:
Вы должны добавить клиентскую опцию к вашему mysql-коннектору,
allowPublicKeyRetrieval=true
чтобы позволить клиенту автоматически запрашивать открытый ключ с сервера. Обратите внимание, что этоAllowPublicKeyRetrieval=True
может позволить вредоносному прокси-серверу выполнить MITM-атаку для получения пароля в виде открытого текста, поэтому по умолчанию он имеет значение False и должен быть явно включен.https://mysql-net.github.io/MySqlConnector/connection-options/
вы также можете попробовать добавить,
useSSL=false
когда используете его для тестирования / разработкипример:
источник
useSSL=false&allowPublicKeyRetrieval=true
это то , что мне нужно было только тогда , когда я попытался подключения отdocker_container1
кdocker_container2_mysql(where mysql is installed)
в моем локальном хосте. Пока от моей хост-машины доdocker_container2_mysql
этогоuseSSL=false
достаточно.Использовать
jdbc url
как:PortNo: 3306
может отличаться в вашей конфигурацииисточник
Для пользователей DBeaver :
Щелкните правой кнопкой мыши ваше соединение и выберите «Редактировать соединение».
На экране «Настройки подключения» (главный экран) нажмите «Изменить настройки драйвера».
Щелкните "Свойства соединения".
Щелкните правой кнопкой мыши область «Свойства пользователя» и выберите «Добавить новое свойство».
Добавьте два свойства: useSSL и allowPublicKeyRetrieval.
Установите для них значения «ложь» и «истина», дважды щелкнув столбец «значение».
источник
В качестве альтернативы предлагаемым ответам вы можете попробовать использовать плагин аутентификации mysql_native_password вместо плагина аутентификации caching_sha2_password .
источник
Я решаю эту проблему, используя приведенную ниже конфигурацию в Spring boot framework.
источник
В моем случае это была ошибка пользователя. Я использовал
root
пользователя с неверным паролем. Я не уверен, почему я не получил ошибку аутентификации, а вместо этого получил это загадочное сообщение.источник
Вышеупомянутая ошибка в моем случае была вызвана неправильным именем пользователя и паролем. Решение проблемы: 1. Перейдите в строку DriverManager.getConnection («jdbc: mysql: // localhost: 3306 /? UseSSL = false», «имя пользователя», «пароль»); Поля имя пользователя и пароль могут быть неправильными. Введите имя пользователя и пароль, которые вы используете для запуска клиента mysql. Имя пользователя, как правило, root, а пароль - это строка, которую вы вводите, когда появляется экран, похожий на этот, Начальный экран mysql
Примечание. В вашем случае имя порта 3306 может быть другим.
источник
Эта проблема меня расстраивает, потому что вчера я мог взаимодействовать с базой данных, но, вернувшись сегодня утром, я начал получать эту ошибку.
Я попытался добавить
allowPublicKeyRetrieval=true
флаг, но продолжал получать ошибку.То, что исправлено для меня, было сделано
Project->Clean
в Eclipse иClean
на моем сервере Tomcat. Один (или оба) исправили это.Я не понимаю почему, потому что я создаю свой проект с помощью Maven и перезагружаю свой сервер после каждого изменения кода. Очень раздражает ...
источник
Обновите useSSL = true в подключении приложения весенней загрузки к mysql;
источник
Я также столкнулся с такой проблемой при докеризации нашего существующего приложения. Решение: добавить параметр подключения MySQL allowPublicKeyRetrieval со значением true в строку подключения JDBC. Если это не работает, попробуйте также добавить параметр useSSL в false .
Результирующая строка будет выглядеть так:
источник
Это решение работало для MacOS Sierra и работало под управлением MySQL версии 8.0.11. Убедитесь, что драйвер, который вы добавили в путь сборки - «добавить внешнюю банку» должен соответствовать версии SQL.
источник
Укажите URL-адрес подключения как jdbc: mysql: // localhost: 3306 / hb_student_tracker? AllowPublicKeyRetrieval = true & useSSL = false & serverTimezone = UTC
источник
Если при подключении mysql (локального контейнера или контейнера mysql, в котором запущен mysql) возникает следующая ошибка:
java.sql.SQLNonTransientConnectionException: получение открытого ключа запрещено
Решение: добавьте в службу базы данных следующую строку:
источник
Прежде всего, убедитесь, что ваш сервер базы данных запущен и работает. Я получал ту же ошибку, попробовав все ответы, перечисленные здесь, я обнаружил, что мой сервер базы данных не работает.
Вы можете проверить то же самое из MySQL Workbench или командной строки, используя
Это кажется очевидным, но много раз мы предполагаем, что сервер базы данных работает постоянно, особенно когда мы работаем на нашем локальном компьютере, когда мы перезапускаем / выключаем машину, сервер базы данных будет отключен автоматически.
источник
Это также может произойти из-за неправильного имени пользователя или пароля. В качестве решений я добавил
allowPublicKeyRetrieval=true&useSSL=false
часть, но все равно получил ошибку, затем я проверил пароль, и он был неправильным.источник