文章目录
前言
“Public Key Retrieval is not allowed”错误及其解决方案
MySQL连接错误:“Public Key Retrieval is not allowed” 问题总结
1. 错误原因
- 触发环境:MySQL服务器版本为8.0或更高,且用户认证插件为默认的
caching_sha2_password。 - 根本原因:MySQL 8.0+为了增强安全性,默认使用SSL加密连接。当SSL未启用时,客户端默认不允许以不安全的方式从服务器检索公钥来进行身份验证,从而阻止了潜在的中间人攻击。
2. 解决方案(核心)
通过在的连接字符串或驱动属性中明确允许客户端检索公钥。
最终生效的配置方法(如图中所示):
在数据库连接工具的 “Advanced” (高级) 标签页中,直接修改 驱动属性。
- 关键属性:
allowPublicKeyRetrieval - 设置值:
TRUE

3. 其他配置方法(供参考)
A. 连接字符串/URL(适用于代码或配置文件中)
在JDBC连接URL的末尾添加参数:
jdbc:mysql://your-host:3306/your-database?allowPublicKeyRetrieval=true&useSSL=false
B. 应用程序配置文件(以Spring Boot为例)
在 application.properties 中:
spring.datasource.url=jdbc:mysql://localhost:3306/your_db?allowPublicKeyRetrieval=true&useSSL=false
4. 补充说明与安全建议
- 关于
useSSL=false:您可能注意到,上面的代码示例中通常伴随useSSL=false。这是因为在本地开发环境或可信的内部网络中,为求简便可以暂时禁用SSL。您图中仅设置allowPublicKeyRetrieval=TRUE也能成功,是因为工具可能采用了其他默认SSL设置(如useSSL=true但requireSSL=false等)。 - 安全警告:
allowPublicKeyRetrieval=true会降低连接的安全性,因为它允许在未加密的连接上传输公钥。- 生产环境强烈建议:
- 启用SSL加密(配置
useSSL=true并提供有效的证书)。 - 考虑更改用户认证插件为
mysql_native_password(一种旧的认证方式,无需公钥交换),但这并非最佳安全实践,仅作为临时或兼容性方案。
- 启用SSL加密(配置
5. 解决流程图(快速决策)
graph TD
A[遇到错误] --> B{环境类型?}
B --> C[本地/开发环境]
B --> D[生产环境]
C --> E[**首选方案**:<br>设置allowPublicKeyRetrieval=true<br>useSSL=false(简化连接)]
E --> F[问题解决]
D --> G[**正确方案**:<br>1(设置allowPublicKeyRetrieval=true) 并 <br>2(配置有效的SSL证书启用加密连接)]
G --> F

1593

被折叠的 条评论
为什么被折叠?



