MySQL 连接报错: “Public Key Retrieval is not allowed“ 问题解决方案
MySQL 连接报错: “Public Key Retrieval is not allowed” 问题解决方案
在使用 MySQL 8.0 驱动器时,如果没有正确配置公钥检索选项,常会造成以下错误:
java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed
这是一个简单而常见的问题,原因为驱动程序在连接 MySQL 服务器时,不允许通过非安全连接获取公钥。本文将分析错误原因,并提供解决方案。
错误原因分析
在使用 MySQL 8.0 驱动时,存在一些编码系统和驱动配置的新改,通常原因如下:
-
MySQL 的驱动默认使用
caching_sha2_password
验证机制:
无法获取公钥时,驱动会报错。 -
allowPublicKeyRetrieval
未启用:
驱动默认会阻止通过非 SSL 方式获取服务器公钥,以保证安全性。 -
SSL 配置不正确:
如果连接程序启用了 SSL ,但没有正确配置证书或相关配置,也会造成连接失败。 -
Druid 连接池的配置不充分:
Druid 是一种常见的数据库连接池,如果没有配置具体参数,会导致通信错误。
解决方案
基于上述原因,可以采用以下方案解决连接失败问题:
方案 1:配置 allowPublicKeyRetrieval=true
在连接 URL 中添加 allowPublicKeyRetrieval=true
参数,并确保其他配置正确:
jdbc:mysql://172.16.8.88:8306/dcg_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
注意
- 该参数允许客户端通过非 SSL 连接获取公钥,因而进行加密登录。
- 在公网环境下,该参数存在安全风险,建议只在发展或内部环境下使用。
方案 2:确保禁用 SSL
如果不需要使用 SSL ,确保连接 URL 中已显式指定 useSSL=false
:
jdbc:mysql://172.16.8.88:8306/dcg_cloud?useSSL=false&allowPublicKeyRetrieval=true
方案 3:启用 SSL 并配置证书
如果需要使用 SSL 保护通信,则确保正确配置相关证书:
jdbc:mysql://172.16.8.88:8306/dcg_cloud?useSSL=true&requireSSL=true&clientCertificateKeyStoreUrl=file:/path/to/client-keystore&clientCertificateKeyStorePassword=password&trustCertificateKeyStoreUrl=file:/path/to/truststore&trustCertificateKeyStorePassword=password
方案 4:升级/降级 MySQL 驱动程序
如果完全不需要 MySQL 8.0 特性,可考虑降级到 5.x 驱动程序。或者,升级到最新的 8.x 驱动,通常也能解决对应的 bug 和兼容性问题。
总结
如果遇到 “Public Key Retrieval is not allowed” 错误,可依据实际情况,选择上述方案中的一种或多种解决方案。
在实现后,连接问题应该已经解决,同时需根据安全需求核实安全性,以免暴露在公网环境下。