allowPublicKeyRetrieval=true仅临时绕过MySQL 8.0公钥获取报错,但会引发中间人攻击风险;生产环境应改用mysql_native_password认证或启用SSL+CA证书验证,禁用useSSL=false等不安全配置。

allowPublicKeyRetrieval=true 能快速绕过报错,但不等于问题已安全解决
这个报错本质是 MySQL 8.0 默认启用 caching_sha2_password 认证插件后,客户端在 SSL 握手阶段无法获取服务端公钥导致的。直接加 allowPublicKeyRetrieval=true 确实能连上,但它会打开中间人攻击(MITM)风险——攻击者可伪造服务端,诱使客户端用其提供的假公钥加密密码,从而窃取明文凭证。生产环境绝不能只靠这个参数“一加了事”。
useSSL=false 是最危险的“捷径”,尤其在云数据库场景下会彻底失效
很多教程建议同时加 useSSL=false 来配合 allowPublicKeyRetrieval=true,这在本地单机调试时看似有效,但实际隐患极大:
- MySQL 云服务(如 AWS RDS、阿里云 RDS)强制要求 SSL 连接,
useSSL=false会导致连接直接被拒绝,错误变成SSL connection is required - 内网部署若未启用 TLS,密码将以明文形式在网络中传输,违反基本安全规范
- Spring Boot 2.6+ 默认将
useSSL视为弃用参数,运行时会打印警告,未来版本可能移除支持
真正兼容且可控的解法:改认证插件 + 显式指定 driver-class-name
对开发/测试环境最稳妥的做法,是让 MySQL 用户回归 mysql_native_password 认证,它不依赖公钥交换,也无需开启高危参数:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 登录 MySQL 执行:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 确保应用配置中显式声明驱动类:
driver-class-name: com.mysql.cj.jdbc.Driver(不是旧版com.mysql.jdbc.Driver) - 连接 URL 中仍建议保留
serverTimezone=Asia/Shanghai,避免时间字段解析异常 - 执行完
ALTER USER后务必运行FLUSH PRIVILEGES;,否则变更不生效
生产环境必须走 SSL + CA 证书验证,而非放行公钥检索
如果必须用 caching_sha2_password(比如合规审计强制要求),唯一安全路径是启用完整 SSL 链路:
- 从 MySQL 服务端导出 CA 证书(
ca.pem),放入应用 classpath 或指定路径 - JDBC URL 中设为:
?useSSL=true&verifyServerCertificate=true&serverRSAPublicKeyFile=ca.pem - Java 启动参数需包含:
-Djavax.net.ssl.trustStore=/path/to/truststore.jks(若用自签名证书) - 注意:
verifyServerCertificate=true和allowPublicKeyRetrieval=true互斥,后者在此场景下必须为false
公钥检索机制本身就是一个权衡妥协的产物——它试图在无证书环境下提供一点加密能力,但代价是引入可被利用的信任漏洞。真要兼顾可用与安全,就得放弃“自动取公钥”这条路,老老实实配证书或换认证方式。










