返回

揭秘java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed错误的本质及解决指南

后端

解决Java中连接MySQL时出现的java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed错误

前言

当你在使用Java语言连接MySQL数据库时,可能会遇到一个令人头疼的异常:java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed。这个异常表明,由于公钥检索不被允许,导致与数据库的连接失败。不要担心,本指南将一步步教你理解这个错误并提供详细的解决方案。

理解错误信息

java.sql.SQLNonTransientConnectionException本质上是一个JDBC异常,表示与MySQL数据库的连接出了问题。错误信息中,Public Key Retrieval is not allowed进一步指出,连接失败的原因是公钥检索不被允许。

通常,这种情况发生在以下两种场景之一:

  1. 使用SSL/TLS加密连接数据库时: MySQL服务器要求客户端提供公钥,但客户端无法或拒绝提供。

  2. MySQL服务器启用了强制使用公钥认证: 客户端没有提供公钥。

解决方案

1. 检查MySQL服务器配置

首先,确认你的MySQL服务器是否启用了SSL/TLS加密或强制使用公钥认证。

  • SSL/TLS加密: 编辑MySQL配置文件my.cnf,找到[mysqld]段落,检查ssl-ca、ssl-cert和ssl-key三个选项是否设置了相应的值。

  • 强制使用公钥认证: 检查MySQL配置文件中的require_secure_transport选项是否设置为ON。

2. 确保客户端支持SSL/TLS加密

如果MySQL服务器启用了SSL/TLS加密,你需要确保你的Java程序能够支持SSL/TLS连接。

  • 使用JDBC连接字符串参数useSSL=true: 例如,String url = "jdbc:mysql://localhost/test?useSSL=true";

  • 为Java程序添加SSL证书信任库: 例如,System.setProperty("javax.net.ssl.trustStore", "/path/to/truststore.jks");

3. 提供公钥(可选)

如果MySQL服务器启用了强制使用公钥认证,你需要向服务器提供你的公钥。

  • 生成公钥: 使用OpenSSL工具生成RSA公钥,命令如下:openssl genrsa -out client-key.pem 2048

  • 提取公钥: 使用OpenSSL工具提取公钥,命令如下:openssl rsa -in client-key.pem -pubout -out client-key.pub

  • 将公钥提供给MySQL服务器: 使用命令将公钥导入MySQL服务器,命令如下:IMPORT PUBLIC KEY client_key.pub;

常见问题解答

1. 为什么会出现Public Key Retrieval is not allowed错误?

这个错误通常发生在使用SSL/TLS加密连接数据库或MySQL服务器启用了强制使用公钥认证时,但客户端无法提供或没有提供公钥。

2. 如何检查MySQL服务器的SSL/TLS配置?

编辑MySQL配置文件my.cnf,找到[mysqld]段落,检查ssl-ca、ssl-cert和ssl-key三个选项是否设置了相应的值。

3. 如何在Java程序中支持SSL/TLS加密?

使用JDBC连接字符串参数useSSL=true,并为程序添加SSL证书信任库。

4. 如何生成和提供公钥?

使用OpenSSL工具生成RSA公钥,并使用IMPORT PUBLIC KEY命令将公钥导入MySQL服务器。

5. 如果我仍然无法解决错误该怎么办?

请检查你的Java程序代码是否存在错误,确保使用正确的连接参数和公钥。如果问题仍然存在,可以查看MySQL服务器日志或联系数据库管理员寻求帮助。

结论

通过遵循本指南,你将能够解决java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed错误,并成功建立与MySQL数据库的连接。记住,仔细检查MySQL服务器配置、确保客户端支持SSL/TLS加密并提供公钥(如果需要),是解决此问题并实现无缝连接的关键步骤。