MySQL 8.0.28创建指定REQUIRE cipher用户连接报Access Denied
问题根因
该问题与SSL密码套件校验逻辑本身无关,是两处默认配置冲突导致TLS协商无法完成,最终在认证阶段抛出Access denied报错:
- mysql:8.0.28官方镜像首次启动自动生成的自签SSL证书默认使用ECDSA椭圆曲线密钥,而指定的
ECDHE-RSA-AES128-GCM-SHA256是RSA密钥体系下的TLS1.2密码套件,ECDSA证书无法支撑该套件的协商,TLS握手会直接失败。这种场景下连接还没走到MySQL用户权限校验的cipher对比环节,所以日志不会出现cipher不匹配提示,只会记录最终的认证失败结果。 - MySQL服务端默认的TLS1.2允许密码套件列表由编译时绑定的OpenSSL默认配置决定,未显式加入指定的目标套件,即使证书类型匹配,协商阶段也不会选中该套件。
修复操作步骤
- 重新启动MySQL实例,显式配置证书生成规则、允许的TLS版本和密码套件,不要使用默认生成的ECDSA证书,启动命令如下:
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root \ -e MYSQL_SSL_CIPHER=ECDHE-RSA-AES128-GCM-SHA256 \ mysql:8.0.28 \ --tls-version=TLSv1.2 \ --ssl-ciphers=ECDHE-RSA-AES128-GCM-SHA256 \ --require-secure-transport=ON
配置说明:添加
MYSQL_SSL_CIPHER环境变量会触发镜像启动脚本生成支持RSA套件的证书,替代默认的ECDSA证书;启动参数显式限制服务端仅支持TLS1.2、仅接受指定密码套件,避免协商出非预期套件。
- 以root身份连接数据库后,重新创建对应用户,原cipher约束规则不需要调整:
DROP USER IF EXISTS 'user'@'%'; CREATE USER 'user'@'%' IDENTIFIED BY 'root' REQUIRE CIPHER 'ECDHE-RSA-AES128-GCM-SHA256'; FLUSH PRIVILEGES;
- 客户端连接时显式强制SSL模式、TLS版本和目标密码套件,不要使用默认的PREFERRED模式,避免隐式降级:
mysql -u user -h 127.0.0.1 --port 3306 -p \ --ssl-mode=REQUIRED \ --ssl-cipher=ECDHE-RSA-AES128-GCM-SHA256 \ --tls-version=TLSv1.2
验证标准
- 使用不匹配的密码套件连接时,日志会正常记录cipher mismatch提示,返回Access denied,与原有现象一致。
- 使用指定的正确套件连接时,可正常通过认证,连接后执行
\s命令查看连接状态,SSL字段会明确显示当前使用的是ECDHE-RSA-AES128-GCM-SHA256加密套件。
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

