چرا برنامهی قدیمی بعد از ارتقا وصل نمیشود؟
از MySQL 8.0 پلاگین پیشفرض احراز هویت caching_sha2_password است که از SHA-256 و نمک استفاده میکند و بسیار امنتر از mysql_native_password قدیمی (SHA-1) است. کلاینتهای قدیمی مثل PHP پیش از 7.4، Connector/J سری 5.1، نسخههای قدیمی Navicat یا نرمافزارهای حسابداری ده سال پیش این پلاگین را نمیشناسند و با پیامهایی مثل Authentication plugin 'caching_sha2_password' cannot be loaded یا The server requested authentication method unknown to the client شکست میخورند.
در MySQL 8.4 پلاگین قدیمی بهطور پیشفرض غیرفعال است و در نسخههای 9 کاملاً حذف شده؛ پس راه درست، ارتقای کلاینت است و فعال کردن پلاگین قدیمی فقط یک راه موقت.
-- چه کسی با چه پلاگینی وارد میشود؟
SELECT user, host, plugin FROM mysql.user;
-- راه موقت برای یک نرمافزار قدیمی (در 8.4 اول در my.cnf بنویسید: mysql_native_password=ON)
ALTER USER 'legacy_erp'@'10.0.0.40'
IDENTIFIED WITH mysql_native_password BY 'Temp-Secret-Until-Upgrade';
-- اجبار رمزنگاری برای یک کاربر یا کل سرور
ALTER USER 'sara_bi'@'10.0.0.25' REQUIRE SSL;
SET PERSIST require_secure_transport = ON;
caching_sha2 چطور کار میکند
اولین ورود هر کاربر باید روی کانال امن انجام شود: TLS، سوکت یونیکس یا تبادل رمز با کلید عمومی RSA سرور. پس از ورود موفق، چکیدهی رمز در حافظهی سرور cache میشود و ورودهای بعدی سریعاند. این cache با ریاستارت سرور خالی میشود؛ به همین دلیل گاهی برنامهای که هفتهها بدون TLS کار میکرد، بعد از ریاستارت با Authentication requires secure connection قطع میشود.
mysql -h 10.0.0.11 -u web -p --ssl-mode=VERIFY_CA --ssl-ca=/etc/mysql/ca.pem
# اگر TLS ندارید (فقط در شبکهی داخلی مطمئن):
mysql -h 10.0.0.11 -u web -p --get-server-public-key
در JDBC معادل گزینهی دوم allowPublicKeyRetrieval=true است.
حالتهای TLS در کلاینت
| ssl-mode | رمزنگاری | بررسی هویت سرور |
|---|---|---|
| PREFERRED (پیشفرض) | اگر سرور پشتیبانی کند | خیر |
| REQUIRED | اجباری | خیر |
| VERIFY_CA | اجباری | گواهی توسط CA شما امضا شده باشد |
| VERIFY_IDENTITY | اجباری | CA و تطابق نام میزبان |
MySQL 8 در اولین راهاندازی گواهی self-signed میسازد، پس اتصالها معمولاً رمز شدهاند؛ اما بدون VERIFY_CA جلوی حملهی مرد میانی گرفته نمیشود. برای دیدن وضعیت اتصال فعلی: SHOW SESSION STATUS LIKE 'Ssl_cipher';
نکتههایی که کمتر کسی میداند
- اتصال با سوکت (host برابر
localhostدر لینوکس) امن حساب میشود؛ برای همین caching_sha2 روی خود سرور بیدردسر است و از ماشین دیگر خطا میدهد. - چرخش رمز بدون قطعی:
ALTER USER 'web'@'10.0.0.%' IDENTIFIED BY 'New' RETAIN CURRENT PASSWORD;سپس برنامهها را یکییکی بهروز کنید و در پایانALTER USER ... DISCARD OLD PASSWORD; - متغیر
default_authentication_pluginمنسوخ شده و در 8.4 وجود ندارد؛ جایگزینشauthentication_policyاست. - رمز را در اسکریپتهای cron ننویسید؛
mysql_config_editor set --login-path=backup ...آن را در فایل مبهمشدهی.mylogin.cnfنگه میدارد و با--login-path=backupاستفاده میشود. - کامپوننت
validate_passwordباINSTALL COMPONENT 'file://component_validate_password';نصب میشود و رمزهای ضعیف را در CREATE USER رد میکند.