有時候在連接實例的時候會遇到這樣的報錯Public Key Retrieval is not allowed
問題分析
這是因為賬號使用了sha256_password或者caching_sha2_password 密碼插件
而sha256_password或者caching_sha2_password 插件為了加快認證過程,在服務端維護了一個密碼哈希緩存。當客戶端發起連接時:
- 如果用戶的密碼哈希已經被緩存,服務端可以直接驗證,無需客戶端發送明文密碼進行驗證。
- 如果緩存中沒有該用戶的密碼哈希,則客戶端需要發送明文密碼進行認證。
在發送明文密碼時,出于安全考慮,MySQL 要求:
- 要么客戶端和服務端之間建立 SSL 加密連接。
- 要么客戶端允許通過服務端公鑰加密明文密碼。
如果兩者都不滿足,就會拋出 Public Key Retrieval is not allowed 錯誤。
以下三種情況會導致緩存中沒有用戶的密碼哈希
- 發生重啟
- 發生HA
- 有操作flush privileges
解決方法
1、客戶端的話可以設置驅動中的allowPublicKeyRetrieval=true
2、JDBC的話可以在連接字符串中添加allowPublicKeyRetrieval=true參數,以允許公鑰檢索。
jdbc:mysql://localhost:3306/?allowPublicKeyRetrieval=true
3、將賬號的密碼插件改為mysql_native_password
注意事項
設置allowPublicKeyRetrieval=true的方法會自動從 MySQL 服務端獲取 RSA 公鑰,但這種方法有一定的安全風險,可能會受到中間人攻擊。攻擊者可以偽造 RSA 公鑰,竊取用戶密碼。