You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:10:23