在使用 MySQL 8 时重启应用后提示 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Public Key Retrieval is not allowed
文档中(https://mysql-net.github.io/MySqlConnector/connection-options/)给出的解释是:
如果用户使用了 sha256_password 认证,密码在传输过程中必须使用 TLS 协议保护,但是如果 RSA 公钥不可用,可以使用服务器提供的公钥;可以在连接中通过 ServerRSAPublicKeyFile 指定服务器的 RSA 公钥,或者AllowPublicKeyRetrieval=True参数以允许客户端从服务器获取公钥;但是需要注意的是 AllowPublicKeyRetrieval=True可能会导致恶意的代理通过中间人攻击(MITM)获取到明文密码,所以默认是关闭的,必须显式开启
在workbench里可以直接窗口配置,工具栏-server-user and privileges 里打开后会显示root @ localhost 未设置密码,然后自己设置一个密码就可以了
在MySQL 8中,出现"Public Key Retrieval is not allowed"错误通常是由于MySQL连接的加密设置引起的。这通常涉及到使用SSL/TLS进行加密连接,而客户端无法正确处理公钥检索。以下是解决此问题的一些方法:
修改连接参数:
在连接MySQL时,您可以尝试在连接字符串中添加allowPublicKeyRetrieval=true
参数,以允许公钥检索。例如:
jdbc:mysql://localhost:3306/your_database?allowPublicKeyRetrieval=true
检查SSL/TLS设置: 如果您的MySQL服务器已配置为要求SSL/TLS连接,请确保您的客户端驱动程序支持并正确配置了SSL/TLS选项。您可能需要提供正确的SSL证书和密钥文件。
更新MySQL Connector/J驱动程序: 如果您正在使用Java连接MySQL数据库,确保您使用的是最新版本的MySQL Connector/J驱动程序。旧版本的驱动程序可能存在与加密相关的问题。
检查MySQL用户权限: 确保连接MySQL的用户具有足够的权限来进行SSL/TLS连接和公钥检索。您可以使用如下命令为用户授予这些权限:
GRANT USAGE ON *.* TO 'your_user'@'your_host' REQUIRE SSL;
查看MySQL错误日志: 查看MySQL服务器的错误日志,可能会提供有关问题的更多详细信息。您可以在日志中找到有关SSL/TLS连接和公钥检索的相关信息。
配置my.cnf文件:
如果您正在使用MySQL的CLI工具连接,您可以在my.cnf
文件中添加以下配置,以允许公钥检索:
[mysql]
allowPublicKeyRetrieval=true
请注意,每种解决方法的适用性可能因您的具体情况而异。如果您仍然无法解决问题,可能需要进一步检查您的环境和配置,或者参考MySQL的官方文档和技术社区寻求帮助。