Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг
ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70% Забронировать скидку
10 Июл 2023
3 мин
2908

Решение проблемы с «Public Key Retrieval is not allowed» при подключении Java к MySQL

Проблема Когда разработчики пытаются подключиться к базе данных MySQL с использованием Java и коннектора версии 8.0.11, они часто сталкиваются с исключением

Разработка на Java — востребованное направление, такие специалисты будут нужны на рынке еще долго. На курсе «Java-разработчик» от Skypro освоить профессию можно с нуля за 11 месяцев, даже если вы гуманитарий и ничего не знаете об IT. Программа составлена от простого к сложному и адаптирована для новичков. Преподаватели — практикующие специалисты из крупных компаний: «Сбер», «Самокат» и других.

Проблема

Когда разработчики пытаются подключиться к базе данных MySQL с использованием Java и коннектора версии 8.0.11, они часто сталкиваются с исключением java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed. Это исключение генерируется при попытке установить соединение с базой данных.

Вот типичный пример кода, который может вызвать это исключение:

public class ConnectionManager {

    public static final String serverTimeZone = "UTC";
    public static final String serverName = "localhost";
    public static final String databaseName ="database";
    public static final int portNumber = 3306;
    public static final String user = "username";
    public static final String password = "password";

    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 Connector/J 8.0 по умолчанию не разрешает извлечение публичного ключа из сервера MySQL, что необходимо для аутентификации с использованием кешированных учетных данных.

Решение

Решение этой проблемы довольно простое и заключается в добавлении параметра allowPublicKeyRetrieval=true в строку подключения к базе данных. Это позволит коннектору извлекать публичный ключ из сервера MySQL.

Вот как может выглядеть исправленный код:

public class ConnectionManager {

    public static final String serverTimeZone = "UTC";
    public static final String serverName = "localhost";
    public static final String databaseName ="database";
    public static final int portNumber = 3306;
    public static final String user = "username";
    public static final String password = "password";

    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 );
        dataSource.setAllowPublicKeyRetrieval(true);

        return dataSource.getConnection();
    }
}

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

Освойте Java на курсе онлайн-университета Skypro. Учебе нужно будет уделять всего 10 часов в неделю: сможете совмещать с работой и личными делами. Вас ждут 440 часов теории и практики, мастер-классы с реальными рабочими задачами, опытные преподаватели, кураторы и наставники. За время обучения сделаете два полноценных проекта для портфолио и множество домашних заданий, чтобы отработать навыки.

Добавить комментарий

Подарок
Забрать подарок