返回
Java 连接 MySQL 时如何解决 \
java
2024-04-01 09:45:02
Java 中连接 MySQL 时解决 "公共密钥检索不被允许" 错误
简介
在使用 Java Connector 8.0.11 连接 MySQL 数据库时,开发人员可能遇到 "公共密钥检索不被允许" 的错误。这表明 MySQL 服务器未配置为允许客户端使用 SSL 公钥进行身份验证。本文将深入探讨此错误的根源,并提供分步解决方案,帮助你建立成功的连接。
错误原因
此错误通常由以下原因引起:
- MySQL 服务器未配置为允许公共密钥检索
- Java 代码未正确配置 SSL 连接
- 未生成或导入有效的密钥库
解决方案
要解决此错误,请执行以下步骤:
检查 MySQL 服务器配置
确保 MySQL 配置文件(通常位于 /etc/mysql/my.cnf
)包含 ssl-ca
和 ssl-cert
选项,并指向有效的证书和 CA 文件。
修改 Java 代码
在 Java 代码中,使用 useSSL
和 trustCertificateKeyStoreUrl
属性配置 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 连接。