有时候在连接实例的时候会遇到这样的报错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 公钥,窃取用户密码。