Перейти к содержанию
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
exlends
Категории
  1. Главная
  2. Категории
  3. Базы данных
  4. MySQL Public key retrieval is not allowed — как исправить

MySQL Public key retrieval is not allowed — как исправить

Запланировано Прикреплена Закрыта Перенесена Базы данных
mysqlошибка подключенияjdbc
1 Сообщения 1 Постеры 2 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • kirilljsxK В сети
    kirilljsxK В сети
    kirilljsx
    js
    написал отредактировано
    #1

    Когда вы пытаетесь подключиться к MySQL 8 и выше, иногда возникает ошибка «Public key retrieval is not allowed». Это раздражающий баг, который чаще всего появляется при работе с DBeaver, Confluence, Spring приложениями или другими инструментами, использующими JDBC драйверы. На самом деле решение довольно простое, и мы разберёмся, как это исправить.

    Эта проблема стала актуальной после того, как MySQL перешёл на более строгую аутентификацию по умолчанию. Если вы разработчик или администратор базы данных, эта ошибка вас обязательно когда-нибудь настигнет. Давайте поговорим о причинах и способах её решения.

    Почему вообще возникает эта ошибка

    Ошибка появляется не просто так — за ней стоит конкретная проблема с аутентификацией. В MySQL 8 по умолчанию используется плагин caching_sha2_password, который требует RSA-шифрования для безопасности. Это хороший подход с точки зрения безопасности, но на практике создаёт головную боль при локальной разработке.

    Проблема возникает, когда одновременно выполняются три условия: аутентификация использует caching_sha2_password, SSL отключён или недоступен, и клиент не имеет явного разрешения на получение публичного ключа. Драйвер MySQL пытается получить открытый ключ для шифрования пароля, но из соображений безопасности это действие блокируется по умолчанию.

    Важно понимать: это не ошибка неправильного пароля. Вы вводите всё правильно, но процесс аутентификации не может завершиться из-за политики безопасности. Драйвер просто отказывается автоматически извлекать открытый ключ для шифрования учётных данных.

    Быстрое решение для разработки: allowPublicKeyRetrieval=true

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

    Для DBeaver нужно отредактировать параметры драйвера через графический интерфейс. Просто щёлкните правой кнопкой на подключении MySQL, выберите «Edit Connection», перейдите на вкладку «Edit Driver Settings» или «Driver properties», найдите параметр allowPublicKeyRetrieval и установите его значение на true. Параллельно можно отключить SSL, установив useSSL на false, если вы не используете шифрование локально.

    Для Java приложений нужно добавить параметры прямо в JDBC URL:

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

    Для Spring приложений добавьте это в application.properties:

    spring.datasource.url=jdbc:mysql://localhost:3306/myDatabase?allowPublicKeyRetrieval=true&useSSL=false
    

    Для других систем, использующих JDBC, например Cascade CMS, отредактируйте файл конфигурации и добавьте параметры в URL подключения к базе:

    • Остановите приложение
    • Отредактируйте конфиг с подключением к MySQL
    • Добавьте параметры allowPublicKeyRetrieval=true и useSSL=false
    • Перезагрузите приложение

    Важно: это решение предназначено только для локальной разработки! Никогда не используйте это в production-среде. В продакшене вы должны правильно настроить SSL или использовать более безопасные методы аутентификации.

    Более безопасный способ: включение SSL

    Если вы хотите сделать всё правильно — даже в разработке, — нужно включить SSL. Это более трудоёмко, но гораздо безопаснее и подготовит ваши приложения к production-среде. При включённом SSL драйвер может безопасно получить открытый ключ от сервера через защищённое соединение.

    Для этого подхода нужно либо иметь сертификат на сервере MySQL, либо использовать самоподписанный сертификат для разработки. Затем в строке подключения устанавливаете useSSL=true и указываете параметры доверия сертификату. Это гарантирует, что соединение действительно защищено, и ваше приложение будет работать одинаково как на локальной машине, так и в production.

    Недостаток в том, что требует больше настройки и может быть сложным при работе с Docker контейнерами. Но если вы серьёзно занимаетесь разработкой, это стоит освоить.

    Альтернативное решение: изменение типа аутентификации

    Есть ещё один способ — изменить плагин аутентификации пользователя с caching_sha2_password на mysql_native_password. Это более старый и менее безопасный метод, но он не требует шифрования при отключённом SSL.

    Если вы создавали пользователя через MySQL установщик и выбрали опцию «Use Strong Password Encryption», то именно поэтому у вас caching_sha2_password. Чтобы переключиться, нужно:

    • На Windows запустить MySQL установщик, выбрать reconfigure и следовать мастеру, переключившись на Legacy Authentication
    • На Mac перейти в System Preferences → MySQL → Initialize Database и изменить там параметр
    • На Linux отредактировать конфиг MySQL вручную

    Альтернативно можно создать нового пользователя с нужным плагином прямо через SQL команды. Например:

    CREATE USER newuser@localhost IDENTIFIED WITH mysql_native_password BY 'password';
    GRANT ALL PRIVILEGES ON database.* TO newuser@localhost;
    

    Этот подход работает, но имеет минусы:

    • Снижает безопасность вашей базы данных
    • Требует изменения конфигурации MySQL на уровне сервера
    • Не рекомендуется для production-сред
    • Может потребовать перезагрузки MySQL сервиса

    Таблица с сравнением решений

    Решение Сложность Безопасность Для разработки Для production
    allowPublicKeyRetrieval=true Низкая Низкая Отлично Нет
    Включение SSL Средняя Высокая Хорошо Отлично
    Изменение auth plugin Средняя Низкая Работает Нет

    Что делать при использовании Docker

    Если ваша MySQL работает в Docker контейнере, решение принципиально не отличается, но есть несколько нюансов. Во-первых, убедитесь, что сам контейнер запущен — иначе вы получите ошибку подключения вместо ошибки про public key.

    Во-вторых, при работе с Docker часто используется строка подключения с сервисным именем вместо localhost. Например:

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

    Где mysql — это имя сервиса в docker-compose. Всё остальное остаётся тем же: добавляете параметры allowPublicKeyRetrieval=true и useSSL=false.

    Некоторые разработчики сообщают, что проблема может быть в самом образе MySQL — тогда имеет смысл использовать MariaDB вместо официального образа MySQL. MariaDB полностью совместима с MySQL в большинстве случаев и часто проще настраивается.

    Чего не стоит делать

    При попытке исправить эту ошибку многие совершают ошибки. Не пытайтесь просто отключить SSL и надеяться на лучшее — это может сработать, но оставит лазейку в безопасности. Не добавляйте allowPublicKeyRetrieval=true в production конфиги — это проблема настоящая, которую нужно решать правильно.

    Не пытайтесь обновлять драйвер MySQL бесконечно в надежде, что это поможет. Проблема не в драйвере — она в том, как MySQL 8 работает с аутентификацией. Некоторые люди сразу переходят на более старую версию MySQL (5.7), но это не очень хорошая идея, так как вы потеряете обновления безопасности.

    Финальные размышления

    Ошибка «Public key retrieval is not allowed» выглядит страшнее, чем она есть на самом деле. Это просто результат того, что MySQL стал более безопасным по умолчанию. Для локальной разработки быстрое решение с allowPublicKeyRetrieval=true работает отлично и позволяет вам быстро перейти к реальной работе.

    Однако стоит помнить, что это временное решение и постепенно переходить на более правильные подходы — либо включать SSL, либо правильно настраивать аутентификацию. Ваши production системы будут вам благодарны за эту внимательность.

    1 ответ Последний ответ
    0

    Категории

    • Главная
    • Новости
    • Фронтенд
    • Бекенд
    • Языки программирования

    Контакты

    • Сотрудничество
    • info@exlends.com
    • Наш чат
    • Наш ТГ канал

    © 2024 - 2025 ExLends, Inc. Все права защищены.

    Политика конфиденциальности
    • Войти

    • Нет учётной записи? Зарегистрироваться

    • Войдите или зарегистрируйтесь для поиска.
    • Первое сообщение
      Последнее сообщение
    0
    • Лента
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы