Java连接Mysql数据库异常:Public Key Retrieval is not allowed

Java连接Mysql数据库异常:Public Key Retrieval is not allowed

本文主要介绍通过connector 8.0.17连接Mysql数据库,出现Public Key Retrieval is not allowed(Exception in thread “main”java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed)的异常信息的解决方法。

 

堆栈跟踪:

Exception in thread "main" java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:108) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at 
 com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:862) at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:444) at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:230) at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:226) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:438) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:146) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:119) at ConnectionManager.getConnection(ConnectionManager.java:28) at Main.main(Main.java:8)

连接代码:

public class ConnectionManager {

    public static final String serverTimeZone = "UTC";
    public static final String serverName = "localhost";
    public static final String databaseName ="mysqldb";
    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 );

        return dataSource.getConnection();
    }
}

解决异常问题

解决此异常问题需要将allowPublicKeyRetrieval=trueuseSSL=false

1)通过代码设置

dataSource.setAllowPublicKeyRetrieval(true);
dataSource.setUseSSL(false);

2)jdbc的url设置

jdbc:mysql://localhost:3306/Database_dbName?allowPublicKeyRetrieval=true&useSSL=false;

3)Spring boot配置

spring.datasource.url=jdbc:mysql://localhost:3306/db-name?useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
DBeaver是一款流行的开源数据库管理工具,它支持多种数据库,包括MySQL、PostgreSQL、Oracle等。当您在使用DBeaver尝试连接数据库时遇到"Public Key Retrieval is not allowed"(公钥获取被禁止)的错误,这通常是因为DBeaver试图验证与数据库服务器之间的SSL/TLS安全连接,但没有得到服务器提供的必要的数字证书(public key)。 这个问题可能有以下几个原因: 1. 证书信任设置:DBeaver默认依赖操作系统或Java的安全设置来处理证书。如果服务器的证书不是从常见的可信证书颁发机构(CA)签发的,或者DBeaver找不到这些证书,就会显示这个错误。 2. 证书文件未下载:某些情况下,DBeaver可能需要服务器提供的自签名证书文件,确保客户端能够正确识别和验证。 3. 安全策略限制:数据库服务器或公司的防火墙可能设置了不允许公开获取证书的策略。 为了解决这个问题,您可以尝试以下步骤: 1. **检查证书信任设置**:更新DBeaver的信任存储,添加服务器的证书,或者在DBeaver的SSL设置中手动导入证书。 2. **从服务器获取证书**:联系数据库管理员,确认他们是否可以提供证书文件,或者指导如何下载或安装。 3. **更改服务器设置**:如果权限允许,请求数据库管理员调整服务器的SSL配置,允许公钥获取。 4. **临时禁用SSL**:在安全风险可控的情况下,可以尝试禁用DBeaver的SSL验证进行连接,然后解决证书问题后再启用。 5. **更新DBeaver版本**:确保使用的是最新版本的DBeaver,有时候这种问题可能是由于软件的一个已知问题导致的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值