Laravel6.0 with Mysql8 problem for That the server requested authentication method unknown to the client

SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

Nick
3 min readNov 30, 2019

如果 laradock 中設定的是 mysql:latest,在 2018 年時就已經會安裝到 mysql8 了,這時會發現無法正確使用 laravel 預設 Mysql 連線方式與資料庫連線,出現如標題的錯誤訊息,原因是 Mysql8 預設的 hash 方式已經從5.7版的 mysql_native_password 轉為 caching_sha2_password。

網路搜尋到的結論

  1. laravel 與 Mysql 連線是使用 PDO_MYSQL 尚無法支援 caching_sha2_password,官方說明點這
  2. 解決方法 1:降 MySQL 版本成 5.6
  3. 解決方法 2:將 MySQL8 預設使用加密 hash 設回 5.6 版本(推薦,因可以享有 MySQL8 帶來的效能提升)

解法參考

如果是使用 Laradock 的用戶可以參考以下

可以調整 docker-compose.yml 中 mysql 啟動的指令,新增 command 這一行,去將預設的 authentication 改回 5.6 的版本預設。

laradock docker-composer.yml 調整後的 mysql 設定

為什麼MySQL8 要將 hash 方法更新,參考Mysql方說明

  1. 安全性:NIST 在2015時建議應該停止使用 sha1 的 hash算法
  2. 效率:以 cache 機制優化驗證速度

補充:MySQL 5.6版本的 mysql_native_password 依賴 sha1,並且是無加 salt 的模式。

結論

遇雷後,雖然很氣在版本升級時竟然不兼容舊版的程式,希望 PDO_MYSQL 可以趕快跟上 MySQL 這個更新正式讓安全升級實現在各大服務上,而 hash 演算法應該會依循電腦運算速度持續演進的,或許之後發生升級時有沒有一個更無痛的升級方法呢,如果內容有誤歡迎糾正及討論。

如果喜歡我這篇文,可以幫我拍手 1-10 下
如果覺得這文章對你有幫助,可以幫我拍手 10–30
如果覺得想看到更多關於學習筆記的文章,可以幫我拍手 30–50
讓我知道也記得 Follow我 陳建宇
更歡迎你在下方留言,我很樂意與你討論聊天或回答問題!

參考資料:

--

--

Nick

嗨 我是 Nick,目前在 ShopBack 擔任軟體工程師,喜歡用科技解決問題,偶爾會整理一些工作上的發現分享在這,歡迎大家追蹤及交流