背景:
我正试图通过命令行登录到一个由我们的管理员设置的mysql数据库。我看到他们启用了ssl,因为当我尝试连接时,我会收到以下消息:
mysql --user=root --password=test testdb
ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)
到目前为止我检查的内容:
我已经检查了my.cnf文件中的ssl设置:
[client]
#password = your_password
port = 3306
socket = /var/run/mysqld/mysqld.sock
ssl-ca = /etc/ssl/ca-self-cert.pem
ssl-cert = /etc/ssl/server-self-cert.pem
ssl-key = /etc/ssl/server-self-key.pem
[mysqld]
...
server-id = 100
relay-log = mysqld-relay-bin
ssl-ca = /etc/ssl/ca-self-cert.pem
ssl-cert = /etc/ssl/server-self-cert.pem
ssl-key = /etc/ssl/server-self-key.pem
我试着更改登录命令,改为如下:
mysql --user=root --password=test testdb --protocol=TCP --ssl-ca=/etc/ssl/ca-self-cert.pem
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (111)
以及:
mysql --user=root --password=test testdb --protocol=TCP --ssl-ca=/etc/ssl/ca-self-cert.pem --host=10.123.123.123
ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)
我为主机指定的值与my.cnf 中设置的绑定地址相匹配
我仍然在谷歌上寻找其他文章/帖子。但到目前为止,我还没能找到解决方案。
如有任何建议,我们将不胜感激。
ps。我知道数据库本身是可以的,因为连接到它的web应用程序运行良好。我只需要能够连接,这样我就可以转储数据库。
添加'--skip-ssl'并不能解决问题,它只是一个快速的解决方法。(并可能导致安全问题(
我只需将机器日期更改为当前日期就解决了这个问题。
这件事发生在我重启机器后,时钟不同步。(跳到2010年而不是2017年(
如前所述,--skip-ssl(或MySQL 8.0的--ssl mode=DISABLED(并不能解决这个问题,它只是绕过了它
该错误发生在SSL握手遇到错误时,MySQL对此缺乏详细信息,这是一个已打开的错误:https://bugs.mysql.com/bug.php?id=75311
您应该首先检查您的证书:
openssl verify -CAfile /etc/mysql/newcerts/ca-cert.pem /etc/mysql/newcerts/server-cert.pem /etc/mysql/newcerts/client-cert.pem
然后,您必须遵循MySQL的要求来生成正确的密钥和证书,尤其是关于必须不同的Common Name值:https://dev.mysql.com/doc/refman/8.0/en/creating-ssl-files-using-openssl.html
根据Activ的云支持,这里有一种生成这些证书的方法,可能不是最好的,但它是有效的:
服务器端:
openssl genrsa 2048 > /tmp/cert/mysqld-ca-key.pem
openssl req -sha1 -new -x509 -nodes -days 3650 -key /tmp/cert/mysqld-ca-key.pem -subj "/C=FR/ST=/L=/O=mysqld/CN=mysqld-CA" > /tmp/cert/mysqld-ca-cert.pem
openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout /tmp/cert/mysqld-server-key.pem -subj "/C=FR/ST=/L=/O=mysqld/CN=mysqld-server" > /tmp/cert/mysqld-server-req.pem
openssl rsa -in /tmp/cert/mysqld-server-key.pem -out /tmp/cert/mysqld-server-key.pem
openssl x509 -sha1 -req -in /tmp/cert/mysqld-server-req.pem -days 3650 -CA /tmp/cert/mysqld-ca-cert.pem -CAkey /tmp/cert/mysqld-ca-key.pem -set_serial 01 > /tmp/cert/mysqld-server-cert.pem
客户端:
openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout /tmp/client-cert/mysql-client-key.pem > /tmp/client-cert/mysql-client-req.pem -subj "/C=FR/ST=/L=/O=mysql-client/CN=mysql-client"
openssl rsa -in /tmp/client-cert/mysql-client-key.pem -out /tmp/client-cert/mysql-client-key.pem
openssl x509 -sha1 -req -in /tmp/client-cert/mysql-client-req.pem -days 3650 -CA /tmp/cert/mysqld-ca-cert.pem -CAkey /tmp/cert/mysqld-ca-key.pem -set_serial 01 > /tmp/client-cert/mysql-client-cert.pem
然后将为客户端和服务器端生成的文件复制到正确的目录中。
最后,您可以尝试强制您的密码列表:https://dev.mysql.com/doc/refman/8.0/en/server-status-variables.html#statvar_Ssl_cipher_list
我找到了这个选项
mysql --user=root --password=test testdb --skip-ssl
它还可以与mysqldump命令配合使用。