Підключення Java-MySql: Відкриття відкритого ключа не дозволено


106

Я намагаюся з'єднати базу даних 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
Укажіть, будь ласка, код: як ви намагаєтесь підключитися. Слід стежити за винятком також буде корисним.
Сергій Сирик

Відповіді:


231

Ви повинні додати клієнтську опцію до свого mysql-роз'єму, allowPublicKeyRetrieval=trueщоб дозволити клієнту автоматично запитувати відкритий ключ із сервера. Зауважте, що AllowPublicKeyRetrieval=Trueзловмисний проксі може дозволити виконувати атаку MITM, щоб отримати пароль простого тексту, тому він за замовчуванням є Неправильним і повинен бути явно включений.

https://mysql-net.github.io/MySqlConnector/connection-options/

ви також можете спробувати додати, useSSL=falseколи ви використовуєте його для тестування / розробки

приклад:

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

1
Ну, це спрацювало для мене, але я не впевнений, наскільки законні ці параметри з точки зору безпеки.
Priyank Thakkar

28
useSSL=false&allowPublicKeyRetrieval=trueце те, що мені було потрібно лише тоді, коли я намагався підключитися docker_container1до docker_container2_mysql(where mysql is installed)місцевого господаря. Хоча від мого хост-машини до docker_container2_mysql, useSSL=falseдосить.
prayagupd

1
enablePublicKeyRetrieval = true & amp; useSSL = false, танк у вас це працює
Мартін Клестіль

2
Чи можете ви пояснити, чому це так?
Capn Sparrow

Додавання "enablePublicKeyRetrieval = true" до моєї рядка з'єднання JDBC вирішило проблему моєї системи розвитку після оновлення Windows 10 вчора. Здогадується, Microsoft підключила ще один отвір, і варіант, на мій погляд, слід використовувати "лише для розробки", де SSL не увімкнено.
Альц

30

Використовувати jdbc urlяк:

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

PortNo: 3306 можуть бути різними у вашій конфігурації


Тут невелика корекція. Прийнятними значеннями властивості з'єднання 'useSSL' є: 'TRUE', 'FALSE', 'YES' або 'NO'. Значення 'false;' не прийнятно.
bluelurker

27

Для користувачів DBeaver :

  1. Клацніть правою кнопкою миші ваше з'єднання, виберіть "Редагувати з'єднання"

  2. На екрані "Налаштування підключення" (головний екран) натисніть "Змінити налаштування драйвера"

  3. Клацніть на "Властивості підключення"

  4. Клацніть правою кнопкою миші область "Властивості користувачів" та виберіть "Додати нову властивість"

  5. Додайте два властивості: "useSSL" та "enablePublicKeyRetrieval"

  6. Встановіть їх значення на "false" та "true", подвійним клацанням на стовпчик "value"


10

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

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

4

Я вирішую цю проблему, використовуючи нижню конфігурацію на базі весняного завантаження

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. Ім’я користувача, як правило, корінь, а пароль - це рядок, який ви вводите, коли на екрані, подібному до цього, з'являється екран запуску 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

Я також стикався з такою проблемою під час докерізації наявної програми. Рішення si, щоб додати параметр підключення allowPublicKeyRetrieval MySQL зі значенням 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? EnablePublicKeyRetrieval = 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

Це звучить очевидно, але багато разів ми припускаємо, що сервер баз даних працює і працює постійно, особливо коли ми працюємо на нашій локальній машині, коли ми перезапускаємо / вимикаємо машину, сервер баз даних буде автоматично вимкнений.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.