返回

Java 连接 MySQL 时如何解决 \

java

Java 中连接 MySQL 时解决 "公共密钥检索不被允许" 错误

简介

在使用 Java Connector 8.0.11 连接 MySQL 数据库时,开发人员可能遇到 "公共密钥检索不被允许" 的错误。这表明 MySQL 服务器未配置为允许客户端使用 SSL 公钥进行身份验证。本文将深入探讨此错误的根源,并提供分步解决方案,帮助你建立成功的连接。

错误原因

此错误通常由以下原因引起:

  • MySQL 服务器未配置为允许公共密钥检索
  • Java 代码未正确配置 SSL 连接
  • 未生成或导入有效的密钥库

解决方案

要解决此错误,请执行以下步骤:

检查 MySQL 服务器配置

确保 MySQL 配置文件(通常位于 /etc/mysql/my.cnf)包含 ssl-cassl-cert 选项,并指向有效的证书和 CA 文件。

修改 Java 代码

在 Java 代码中,使用 useSSLtrustCertificateKeyStoreUrl 属性配置 SSL 连接:

MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUseSSL(true);
dataSource.setTrustCertificateKeyStoreUrl(trustCertificateKeyStoreUrl);

生成密钥库

使用 keytool 工具生成包含证书和私钥的密钥库:

keytool -genkeypair -alias mysql-client -keyalg RSA -keysize 2048 -validity 365 -dname "CN=your-hostname, OU=your-department, O=your-organization" -keystore mysql-client-keystore.jks

导出证书

从密钥库导出证书并保存为 PEM 文件:

keytool -exportcert -alias mysql-client -keystore mysql-client-keystore.jks -rfc -file mysql-client-cert.pem

导入证书

将导出的证书导入到 MySQL 服务器中:

mysql -u root -p
USE mysql;
CREATE USER 'client'@'%' IDENTIFIED BY 'your-password';
GRANT ALL ON *.* TO 'client'@'%';
GRANT USAGE ON *.* TO 'client'@'%';
IMPORT CERTIFICATE clientkeystore
    FROM FILE '/path/to/mysql-client-cert.pem';

更新 Java 代码

trustCertificateKeyStoreUrl 属性更新为指向导出的 PEM 证书文件。

重新连接

重新运行 Java 代码以建立安全连接。

其他注意事项

  • 配置防火墙允许来自 Java 应用程序的连接。
  • 使用最新的 MySQL Connector/J 驱动程序。
  • 彻底测试连接。

结论

通过遵循这些步骤,你可以解决 "公共密钥检索不被允许" 的错误,并建立成功的 MySQL 数据库连接。

常见问题解答

  • 为什么会出现这个错误?
    这通常是因为 MySQL 服务器未配置为允许公共密钥检索。
  • 如何生成密钥库?
    使用 keytool 工具:keytool -genkeypair -alias mysql-client -keyalg RSA -keysize 2048 -validity 365 -dname "CN=your-hostname, OU=your-department, O=your-organization" -keystore mysql-client-keystore.jks
  • 为什么需要导入证书?
    导入证书允许 MySQL 服务器验证客户端的身份。
  • 如何解决防火墙问题?
    配置防火墙允许来自 Java 应用程序的连接。
  • 可以使用哪些其他方法来解决此错误?
    使用 JDBC URL 参数 useSSL=false 禁用 SSL 连接。