caching_sha2_password - плагін автентифікації за замовчуванням з MySQL 8.0. Він замінив mysql_native_password, що спирався на SHA-1 без солі: однакові паролі давали однакові хеші, а вкрадена таблиця mysql.user легко перебиралася.
Як працює новий плагін:
- пароль зберігається з сіллю і багатьма раундами SHA-256;
- перша автентифікація користувача після старту сервера - «повна»: пароль треба передати безпечно, тобто через TLS або з шифруванням публічним RSA-ключем сервера;
- після успішного входу сервер кешує хеш у пам'яті, і наступні підключення проходять швидко без повного обміну.
Звідки беруться помилки підключення:
-
Старий клієнт не знає плагіна. Повідомлення на кшталт
The server requested authentication method unknown to the client- типова історія старих версій PHP. Драйверmysqlndпідтримуєcaching_sha2_passwordз PHP 7.4, тож на сучасному PHP проблеми немає. Але старі GUI-клієнти, бібліотеки інших мов і бінарники в Docker-образах можуть її мати. -
Підключення без TLS і без RSA-ключа. Помилка на зразок
Authentication requires secure connection. Варіанти: увімкнути TLS (правильно), дозволити клієнту запитати ключ сервера (--get-server-public-key/GET_SOURCE_PUBLIC_KEY=1для реплікації) чи передати файл ключа. -
Перший вхід після перезапуску. Кеш порожній, і клієнт, що раніше працював «без TLS» завдяки кешу, раптом не підключається. Підступна помилка: усе працювало до перезапуску сервера.
MySQL 8.4: mysql_native_password вимкнено за замовчуванням. Облікові записи, створені зі старим плагіном (наприклад, перенесені з 5.7), після оновлення не зможуть увійти, доки плагін не ввімкнуть:
[mysqld]
mysql_native_password = ON
Це тимчасовий милиць: у MySQL 9 плагін видалено зовсім. Правильний шлях - перевести облікові записи:
SELECT user, host, plugin FROM mysql.user WHERE plugin = 'mysql_native_password';
ALTER USER 'app'@'10.0.0.%' IDENTIFIED WITH caching_sha2_password BY 'пароль';
Практичні висновки:
- перед оновленням до 8.4 знайти всі облікові записи зі старим плагіном і перевести їх;
- підключення до бази за межами одного хоста - через TLS, що одночасно знімає й питання першої автентифікації;
- оновити клієнтські бібліотеки й інструменти, а не повертати старий плагін.
Докладніше в документації: Автентифікація caching_sha2_password