Java连接MySQL报错:Public Key Retrieval is not allowed 求助
解决MySQL Connector 8.0.11连接时的
Public Key Retrieval is not allowed异常 这个问题在使用MySQL 8.0以上版本的JDBC驱动时挺常见的——本质是MySQL 8.0默认用caching_sha2_password作为用户认证插件,而JDBC驱动出于安全考虑,默认禁止从服务器获取公钥来完成RSA加密的认证流程,所以就抛出了这个异常。下面给你两种可行的解决办法:
方法一:修改JDBC连接配置,允许公钥检索
你只需要在ConnectionManager类里,给MysqlDataSource多加一行配置,开启公钥检索权限就行。修改后的完整代码如下:
public class ConnectionManager { public static final String serverTimeZone = "UTC"; public static final String serverName = "localhost"; public static final String databaseName ="biblioteka"; public static final int portNumber = 3306; public static final String user = "anyroot"; public static final String password = "anyroot"; public static Connection getConnection() throws SQLException { MysqlDataSource dataSource = new MysqlDataSource(); dataSource.setUseSSL( false ); dataSource.setServerTimezone( serverTimeZone ); dataSource.setServerName( serverName ); dataSource.setDatabaseName( databaseName ); dataSource.setPortNumber( portNumber ); dataSource.setUser( user ); dataSource.setPassword( password ); // 添加这行配置,允许驱动从服务器获取公钥 dataSource.setAllowPublicKeyRetrieval(true); return dataSource.getConnection(); } }
方法二:修改数据库用户的认证插件
如果你不想改动JDBC代码,也可以把你的anyroot用户的认证方式换成旧版的mysql_native_password,这样驱动就能直接完成认证,不需要公钥检索。登录MySQL后执行以下SQL命令:
ALTER USER 'anyroot'@'localhost' IDENTIFIED WITH mysql_native_password BY 'anyroot'; FLUSH PRIVILEGES;
两种方法的小建议
- 方法一适合需要保留
caching_sha2_password(安全性更高)的场景,只是临时放开公钥检索的限制。 - 方法二更适合兼容旧版本驱动或者想简化配置的场景,不过安全性相对弱一些。
内容的提问来源于stack exchange,提问作者danny
相关产品推荐
相关产品推荐

