MySQL 连接Java – MySQL : Public Key Retrieval is not allowed
在Java程序中,连接MySQL服务器可能会遇到一些问题。 “MySQL : Public Key Retrieval is not allowed” 就是其中之一。本文将介绍这个问题的原因以及如何解决它。
阅读更多:MySQL 教程
问题原因
这个问题通常是由于 MySQL 8 中的默认 SSL 设置引起的。之前,MySQL使用 “mysql_native_password” 认证插件,但从MySQL 8开始,它改为使用 “caching_sha2_password”插件。此插件要求使用 SSL 连接,而默认情况下,Java的JDBC驱动程序不支持 SSL 连接,会导致这个错误。
解决方案
解决方案是启用 SSL连接或改回 “mysql_native_password” 插件。
启用 SSL 连接
要启用 SSL 连接,可以在JDBC连接字符串中添加一些选项,例如:
String url = "jdbc:mysql://localhost:3306/mydb?useSSL=true&requireSSL=true";
Connection conn = DriverManager.getConnection(url, user, password);
在这个例子中,我们使用了 “useSSL=true” 和 “requireSSL=true”。前者告诉MySQL使用 SSL 连接,而后者强制要求使用 SSL 连接,这意味着如果SSL连接失败,将不会建立数据库连接。
改回 “mysql_native_password” 插件
如果你不需要SSL连接,另一种解决方案是修改 MySQL 的身份验证插件。要做到这一点,可以使用 MySQL的 “ALTER USER” 命令:
ALTER USER 'myuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mypassword';
这将把 “myuser” 的身份验证插件从 “caching_sha2_password” 改为 “mysql_native_password”。使用这种方法时,连接字符串无需使用SSL选项:
String url = "jdbc:mysql://localhost:3306/mydb";
Connection conn = DriverManager.getConnection(url, user, password);
总结
在连接 MySQL 8时, “MySQL : Public Key Retrieval is not allowed” 错误是由于默认的 SSL 设置引起的。要解决这个问题,可以启用 SSL连接或改回 “mysql_native_password” 插件。在调整 MySQL 的身份验证插件时,请确保在连接字符串中删除 SSL 选项,以免出现其他问题。