将工作站升级到 Ubuntu 20.04 LTS 后,我无法连接到在 CentOS 7 服务器上运行的 MySQL 5.7.27。我使用命令进行连接mysql -h <server_ip> -u <user_name> -p
,输入密码后出现错误 2026:
ERROR 2026 (HY000): SSL connection error: error:1425F102:SSL
routines:ssl_choose_client_version:unsupported protocol
我也尝试使用 mysqldump 获取数据库数据,但最终出现了类似的错误。我想也许工作站升级后,mysql 客户端不再支持旧协议,因此我使用 ssh 登录服务器,从服务器的 shell 访问 mysql,并查看支持哪些协议
mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';
+---------------+---------------+
| Variable_name | Value |
+---------------+---------------+
| tls_version | TLSv1,TLSv1.1 |
+---------------+---------------+
1 row in set (0,00 sec)
有了这些信息,我再次尝试从工作站进行连接,这次指定了 TLS 版本
mysql -h <server_ip> --tls-version=TLSv1.1 -u <user_name> -p
mysql -h <server_ip> --tls-version=TLSv1 -u <user_name> -p
这两个命令最终都
ERROR 2026 (HY000): SSL connection error: error:141E70BF:SSL routines:tls_construct_client_hello:no protocols available
我发现的唯一解决方法是使用以下方法禁用 SSLmysql -h <server_ip> --ssl-mode=DISABLED -u <user_name> -p
我是否遗漏了什么,或者存在错误?感谢您的回答。
答案1
我找到了一个解决方案,假设您的 MySQL 使用的是 OpenSSL 而不是 yaSSL。
请参阅ssl_密码MySQL 的配置变量。
配置包含伪密码的密码列表@SECLEVEL=1
。
例如,
ssl_cipher = "DHE-RSA-AES128-GCM-SHA256:AES128-SHA:@SECLEVEL=1"
如果你需要一个更宽松但仍然安全的密码列表,
"EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES128-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA128:DHE-RSA-AES128-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA128:ECDHE-RSA-AES128-SHA384:ECDHE-RSA-AES128-SHA128:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA384:AES128-GCM-SHA128:AES128-SHA128:AES128-SHA128:AES128-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4:@SECLEVEL=1"
取自密码列表可能会起到作用。
答案2
作为临时解决方案,您可以从命令行禁用 SSL
$ mysql -h <myserver> -u <myuser> -p --ssl-mode=DISABLED
password:
或者通过创建 my.cnf 文件
$ cat /etc/my.cnf
[client]
ssl-mode=DISABLED
答案3
抱歉,我留下了应该作为评论作为答案的内容(代表性不足),但是:
- 自 Ubuntu 20.04 以来,TLS 1.0 和 1.1 似乎已在系统范围内禁用。
- 我不知道如何重新启用它(这就是我偶然发现这个问题的原因)
openssl s_client -tls1 -connect <some TLSv1-enabled host>:443
除了不起作用之外,我没有其他证据证明这一点,并且都不能nginx
作为服务器支持 TLS 1.0 和 1.1(即使配置正确):/。
1.2 之前的 TLS 版本通常被认为不安全,应避免使用,这可能就是这样做的原因。
恐怕这只提供了一半的答案;我希望有人能提出解决方案来重新启用 TLS 1.0 和/或 1.1。
答案4
使用您最喜欢的编辑器打开/usr/lib/ssl/openssl.cnf
:
vi /usr/lib/ssl/openssl.cnf
在文件顶部添加以下行:
openssl_conf = old_support_conf
在文件底部添加以下行:
[old_support_conf]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
MinProtocol = TLSv1.1
CipherString = DEFAULT@SECLEVEL=1
如果 TLSv1.1 对您不起作用,您可能需要将其更改为 TLSv1 并尝试。