MySQL 5.1.66 SSL 连接错误 ERROR 2026 (HY000)

gah*_*cep 37 mysql replication ssl

更新2

使用 WireShark 我发现了问题字符串(我希望我做到了):

28 | 9.582638 | 192.168.18.128 | 192.168.18.129 | MySQL Response Error 1043
Run Code Online (Sandbox Code Playgroud)

错误是(根据docs):

Error: 1043 SQLSTATE: 08S01 (ER_HANDSHAKE_ERROR)
Message: Bad handshake 
Run Code Online (Sandbox Code Playgroud)

下面是两种情况下WireShark的截图:

从 Windows 8 连接(成功):

在此处输入图片说明

来自 CentOS 的连接(失败):

在此处输入图片说明

为什么会发生这种情况?


更新

一个有趣的声明:
我与主数据库使用的是Windows 8成功连接(192.168.18.1)通过在主修改ssluser设置的192.168.18.1主机-做出了改变:从REQUIRE SSLREQUIRE X509。然而,这在我们的从站到主站连接的情况下不起作用。


我在 CentOS-6.3 中遇到过 SSL 复制问题。我正在使用 OpenSSL 创建客户端和服务器证书,并且客户端和服务器证书都由同一个 CA 签名。

Server IP: 192.168.18.128
Slave  IP: 192.168.18.129
MySQL version 5.1.66 SSL
Run Code Online (Sandbox Code Playgroud)

我使用MySQL 帮助页面的“为 MySQL 设置 SSL 证书和密钥”部分收到的所有证书。

服务器的 my.cnf文件:

[mysqld]
ssl-key=/etc/mysql/certs/server-key.pem
ssl-cert=/etc/mysql/certs/server-cert.pem
ssl-ca=/etc/mysql/certs/ca-cert.pem
Run Code Online (Sandbox Code Playgroud)

客户端的 my.cnf文件:

[client]
ssl-ca=/etc/mysql/ssl/ca-cert.pem
ssl-key=/etc/mysql/ssl/client-key.pem
ssl-cert=/etc/mysql/ssl/client-cert.pem
Run Code Online (Sandbox Code Playgroud)

在 Master 上,我使用 SSL 设置从属用户,如下所示:

CREATE USER 'ssluser'@'192.168.18.129' IDENTIFIED BY 'sslpass';
GRANT REPLICATION SLAVE ON *.* TO 'ssluser'@'192.168.18.129' REQUIRE SSL;
Run Code Online (Sandbox Code Playgroud)

要更新 Slave,我使用以下命令(根据show master status命令):

SLAVE STOP;
CHANGE MASTER TO \
             MASTER_HOST='192.168.18.128',                      \
             MASTER_USER='sslreplicant',                        \
             MASTER_PASSWORD='db.sslreplicantprimary',          \
             MASTER_LOG_FILE='mysql-bin.000026',                \
             MASTER_LOG_POS=106,                                \
             MASTER_SSL=1,                                      \
             MASTER_SSL_CA='/etc/mysql/certs/ca-cert.pem',      \
             MASTER_SSL_CAPATH='/etc/mysql/certs/',             \
             MASTER_SSL_CERT='/etc/mysql/certs/client-cert.pem',\
             MASTER_SSL_KEY='/etc/mysql/certs/client-key.pem';
SLAVE START;
Run Code Online (Sandbox Code Playgroud)

复制本身工作正常:

mysql> SHOW VARIABLES LIKE '%ssl%';

have_openssl  = YES
have_ssl      = YES
ssl_ca        = /etc/mysql/certs/ca-cert.pem
ssl_capath    =
ssl_cert      = /etc/mysql/certs/server-cert.pem
ssl_cipher    =
ssl_key       = /etc/mysql/certs/server-key.pem
Run Code Online (Sandbox Code Playgroud)

这既是-在主站上,也是在从站上。

但是当我手动检查从 Slave 到 Master 的连接时,我收到一个错误。

以下是我迄今为止尝试过的选项(每个人的结果都相同):

[gahcep@localhost  ~]$ mysql -u ssluser -h 192.168.18.128 -p

[gahcep@localhost  ~]$ mysql --ssl --ssl-ca=/etc/mysql/certs/ca-cert.pem \
                             -u ssluser -h 192.168.18.128 -p

[gahcep@localhost ~]$ mysql --ssl-ca=/etc/mysql/certs/ca-cert.pem \
                            --ssl-cert=/etc/mysql/certs/client-cert.pem \
                            --ssl-key=/etc/mysql/certs/client-key.pem \
                            -u ssluser -h 192.168.18.128 -p

Enter password:
ERROR 2026 (HY000): SSL connection error
Run Code Online (Sandbox Code Playgroud)

重现步骤:

  1. 设置/创建由同一 CA 签名的客户端和服务器证书。
  2. 如该线程中所述,在客户端和服务器上设置 my.cnf 文件
  3. 在 master 上为 slave 创建 ssluser
  4. mysql -u ssluser -h 192.168.18.128 -p

请注意,我确实为所有证书使用了不同的通用名称:用于 CA、客户端和服务器。


附加信息

验证结果:

[gahcep@localhost ~]$ sudo openssl verify -purpose sslclient \
           -CAfile /etc/mysql/certs/ca-cert.pem /etc/mysql/certs/client-cert.pem
/etc/mysql/certs/client-cert.pem: OK

[gahcep@localhost ~]$ sudo openssl verify -purpose sslserver \
           -CAfile /etc/mysql/certs/ca-cert.pem /etc/mysql/certs/server-cert.pem
/etc/mysql/certs/server-cert.pem: OK
Run Code Online (Sandbox Code Playgroud)

证件信息:

CA:

[gahcep@localhost ~]$ sudo openssl x509 -noout -subject -issuer -dates \
           -serial -hash -fingerprint -in /etc/mysql/certs/ca-cert.pem
subject= /C=RU/L=Vladivostok/O=Default Company Ltd/CN=PriSec
issuer= /C=RU/L=Vladivostok/O=Default Company Ltd/CN=PriSec
notBefore=Jan  4 06:27:46 2013 GMT
notAfter=Nov 13 06:27:46 2022 GMT
serial=B45D177E85F99578
c2c5b88b
SHA1 Fingerprint=5B:07:AA:39:28:24:CE:1A:CF:35:FA:14:36:23:65:8F:84:61:B0:1C
Run Code Online (Sandbox Code Playgroud)

客户证书:

[gahcep@localhost ~]$ sudo openssl x509 -noout -subject -issuer -dates \
           -serial -hash -fingerprint -in /etc/mysql/certs/client-cert.pem
subject= /C=RU/L=Vladivostok/O=Default Company Ltd/CN=Secondary
issuer= /C=RU/L=Vladivostok/O=Default Company Ltd/CN=PriSec
notBefore=Jan  4 06:29:07 2013 GMT
notAfter=Nov 13 06:29:07 2022 GMT
serial=01
6df9551f
SHA1 Fingerprint=F5:9F:4A:14:E8:96:26:BC:71:79:43:5E:18:BA:B2:24:BE:76:17:52
Run Code Online (Sandbox Code Playgroud)

服务器证书:

[gahcep@localhost ~]$ sudo openssl x509 -noout -subject -issuer -dates \
            -serial -hash -fingerprint -in /etc/mysql/certs/server-cert.pem
subject= /C=RU/L=Vladivostok/O=Default Company Ltd/CN=Primary
issuer= /C=RU/L=Vladivostok/O=Default Company Ltd/CN=PriSec
notBefore=Jan  4 06:28:25 2013 GMT
notAfter=Nov 13 06:28:25 2022 GMT
serial=01
64626d57
SHA1 Fingerprint=39:9E:7A:9E:60:9A:58:68:81:2F:90:A5:9B:BF:E8:26:C5:9D:3C:AB
Run Code Online (Sandbox Code Playgroud)

目录权限:

在大师上:

[gahcep@localhost ~]$ ls -la /etc/mysql/certs/
drwx------. 3 mysql  mysql  4096 Jan  3 23:49 .
drwx------. 3 mysql  mysql  4096 Jan  3 07:34 ..
-rw-rw-r--. 1 gahcep gahcep 1261 Jan  3 22:27 ca-cert.pem
-rw-rw-r--. 1 gahcep gahcep 1675 Jan  3 22:27 ca-key.pem
-rw-rw-r--. 1 gahcep gahcep 1135 Jan  3 22:28 server-cert.pem
-rw-rw-r--. 1 gahcep gahcep 1679 Jan  3 22:28 server-key.pem
-rw-rw-r--. 1 gahcep gahcep  976 Jan  3 22:28 server-req.pem
Run Code Online (Sandbox Code Playgroud)

在奴隶上:

[gahcep@localhost ~]$ ls -la /etc/mysql/certs/
drwx------. 3 mysql mysql 4096 Jan  3 22:57 .
drwx------. 3 mysql mysql 4096 Jan  3 07:50 ..
-rw-r--r--. 1 root  root  1261 Jan  3 22:56 ca-cert.pem
-rw-r--r--. 1 root  root  1139 Jan  3 22:57 client-cert.pem
-rw-r--r--. 1 root  root  1675 Jan  3 22:57 client-key.pem
Run Code Online (Sandbox Code Playgroud)

如果有人可以提出解决方案,我将不胜感激!

小智 1

可能的解决方案:

如何判断MySQL服务器使用的是yaSSL还是OpenSSL

这显示了缺乏合适的全局状态值的解决方法。这个想法是检查Rsa_public_key状态变量:

mysql> show status like '%rsa%';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| Rsa_public_key |       |
+----------------+-------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

如果使用 OpenSSL,则该变量将存在;否则是yaSSL。

其他可能性:

MySQL和SSL连接失败错误2026(HY000)(堆栈溢出)