升级到Ubuntu 20.04后无法连接MySQL(错误2026)。

我在将工作站升级到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

我找到的唯一解决办法是禁用SSL,使用mysql -h <server_ip> --ssl-mode=DISABLED -u <user_name> -p

我是不是漏掉了什么,还是这个是个bug?谢谢你们的回答。

5个回答

作为一个临时解决方案,你可以通过命令行禁用SSL。
$ mysql -h <myserver> -u <myuser> -p --ssl-mode=DISABLED
password:
通过创建一个my.cnf文件来实现
$ cat /etc/my.cnf  
[client] 
ssl-mode=DISABLED

对我来说行不通,因为我的服务器需要SSL。 - JavaHead
试一试吧,我敢肯定它对你也会像对我一样有效,兄弟。 - Mohammed Lubbad
1@MohammedLubbad 我不知道该如何感谢你,但这应该是被接受的答案。 - Rajesh Chaudhary
@RajeshChaudhary 很高兴它对你有用,这应该被接受为解决此问题的答案。请给它投票支持。 - Mohammed Lubbad
已经完成了。@MohammedLubbad 干杯。 - Rajesh Chaudhary
对我也不起作用。仍然面临着同样的问题。 - Ashwani Shakya

抱歉以回答的形式留下本应该是评论的内容(声望不够),但是: 自从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的解决方案。

好的解释!虽然不是完整的答案,但我还是点赞了。 - Timothy Frew

我假设你的MySQL使用的是OpenSSL而不是yaSSL,并找到了一个解决方案。 请参考MySQL的ssl_cipher配置变量。 配置一个包含伪密码@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"
可能从cipherlist.eu中获得的信息可以胜任此任务。

我成功的方法是按照这里描述的mysql 5.7 ciphers启用TLS 1.2。
[mysqld]
tls_version=TLSv1.2
重启后,我又能够成功导入了。

打开您喜欢的编辑器,使用以下路径访问文件:/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并尝试。