一、导致“Public Key Retrieval is not allowed”原因
该错误是在 JDBC 与 MySQL 建立 Connection 对象时出现的;需要明确的是出现该问题的时候,MySQL 配置的密码认证插件为如下两种:
- sha256_password
- caching_sha2_password
使用“mysql_native_password”密码认证插件,不会出现“Public Key Retrieval is not allowed”错误。
注:MySQL 8.0 默认推荐使用“sha256_password”和“caching_sha2_password”这两种认证插件。只有较老的 MySQL 版本仍然会使用“mysql_native_password”。
根据 MySQL 提供的官方文档(https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html),这两种插件都是使用 SHA256 算法来对密码进行保护。这些插件的具体执行流程如下:
- 检查客户端是否禁用 SSL/TLS 加密传输;
- 如果客户端未禁用 SSL/TLS 加密传输,则客户端在进行认证时的认证报文(传输用户名和密码的报文)是使用 TLS 进行传输的,两种插件认为认证报文传输安全,不进行任何其他操作;
- 如果客户端禁用 SSL/TLS 加密传输,则客户端在进行认证时的认证报文(传输用户名和密码的报文)是使用明文进行传输的,两种插件认为认证报文传输不安全,会单独对明文报文中的密码使用 RSA 加密方式进行加密。
二、针对上述错误,有如下的解决方案
根据前面的分析,导致“Public Key Retrieval is not allowed”主要是由于当禁用 SSL/TLS 协议传输后,客户端会使用服务器的公钥进行传输,默认情况下客户端不会主动去找服务器拿公钥,此时就会出现上述错误。
经过查阅官方文档,出现 Public Key Retrieval 的场景可以概括为在禁用 SSL/TLS 协议传输切当前用户在服务器端没有登录缓存的情况下,客户端没有办法拿到服务器的公钥。具体的场景如下:
- 新建数据库用户,首次登录;
- 数据库的用户名、密码发生改变后登录;
- 服务器端调用 FLUSH PRIVELEGES 指令刷新服务器缓存。
针对上述错误,有如下的解决方案:
- 在条件允许的情况下,不要禁用 SSL/TLS 协议,即不要在 CLI 客户端使用--ssl-mode=disabled,或在 JDBC 连接串中加入 useSSL=false;
- 如果必须禁用 SSL/TLS 协议,则可以尝试使用 CLI 客户端登录一次 MySQL 数据库制造登录缓存;
- 如果必须禁用 SSL/TLS 协议,则可以通过增加如下参数允许客户端获得服务器的公钥:
- 在 JDBC 连接串中加入 allowPublicKeyRetrieval=true 参数;
- 在 CLI 客户端连接时加入--get-server-public-key 参数;
- 在 CLI 客户端连接时加入--server-public-key-path=file_name 参数,指定存放在本地的公钥文件。
最后,想说的是:我PC的dbeaver客户端,驱动属性配置了useSSL=true,却也遇到“Public Key Retrieval is not allowed”。Why?母鸡!但是在 JDBC 连接串中加入 allowPublicKeyRetrieval=true 参数之后就可以了。
三、MySQL认证插件简述
MySQL 提供了多种认证插件,如上图支持13种插件;每种插件都有其特定的用途和优缺点。以下是三种常见的认证插件:sha256_password
、mysql_native_password
和 caching_sha2_password
的简介及各自的优缺点。
1. mysql_native_password
简介:
mysql_native_password
是 MySQL 最早的认证插件,也是默认的认证插件。- 它使用基于 SHA-1 的散列算法进行认证。
- 客户端和服务器之间使用散列值进行双向认证。
优点:
- 兼容性:广泛支持,几乎所有 MySQL 客户端和应用程序都支持这种认证方式。
- 性能:认证过程简单,性能较高。
缺点:
- 安全性:SHA-1 散列算法被认为不再安全,容易受到碰撞攻击。
- 明文传输:在不安全的网络环境中,密码可能会以明文形式传输,存在安全隐患。
2. sha256_password
简介:
sha256_password
使用 SHA-256 散列算法进行认证。- 它提供了更高的安全性,但需要客户端和服务器之间进行更多的交互。
- 支持 SSL/TLS 加密,确保密码在传输过程中不被窃取。
优点:
- 安全性:SHA-256 散列算法比 SHA-1 更安全,更难被破解。
- 加密传输:支持 SSL/TLS 加密,确保密码在传输过程中的安全性。
缺点:
- 性能:认证过程复杂,性能较低,特别是在高并发环境下。
- 兼容性:不是所有客户端和应用程序都支持
sha256_password
,需要确保客户端支持该认证方式。 - 配置复杂:需要配置 SSL/TLS 证书,增加了管理和配置的复杂性。
3. caching_sha2_password
简介:
caching_sha2_password
是 MySQL 8.0 引入的新认证插件。- 它结合了
mysql_native_password
和sha256_password
的优点,提供高性能和高安全性。 - 在首次认证时使用 SHA-256 散列算法,之后将认证信息缓存起来,以提高后续认证的性能。
优点:
- 安全性:使用 SHA-256 散列算法,提供高安全性。
- 性能:通过缓存认证信息,提高了后续认证的性能。
- 兼容性:广泛支持,大多数现代客户端和应用程序都支持
caching_sha2_password
。
缺点:
- 配置复杂:需要配置 SSL/TLS 证书,增加了管理和配置的复杂性。
- 缓存风险:虽然缓存提高了性能,但也引入了一定的安全风险,需要确保缓存机制的安全性。
总结
mysql_native_password
:适合需要高性能和广泛兼容性的场景,但安全性较低。sha256_password
:适合需要高安全性的场景,但性能较低,配置复杂。caching_sha2_password
:结合了高性能和高安全性,适合大多数现代应用场景,但需要配置 SSL/TLS 证书。
选择合适的认证插件时,需要根据具体的应用需求和环境来权衡性能、安全性和兼容性。
深度搜索
原文参考:
1、https://www.cnblogs.com/hungryquiter/p/16967443.html
2、https://cloud.tencent.com/developer/news/791903