UPDATE2
WireSharkを使用して、問題の文字列を見つけました(そうしたことを願っています):
28 | 9.582638 | 192.168.18.128 | 192.168.18.129 | MySQL Response Error 1043
そしてエラーは( docs によると):
Error: 1043 SQLSTATE: 08S01 (ER_HANDSHAKE_ERROR)
Message: Bad handshake
以下は、2つのケースでのWireSharkのスクリーンショットです。
Windows 8からの接続(成功):
CentOSからの接続(失敗):
なぜこれが起こるのですか?
[〜#〜]更新[〜#〜]
1つの興味深い通知:
マスターのssluser設定を(192.168.18.1)
ホスト用に変更して、Windows 8 192.168.18.1
を使用してマスターDBに正常に接続しました-REQUIRE SSL
からREQUIRE 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
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
クライアントの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
マスターでは、次のようにSSLを使用してスレーブユーザーをセットアップします。
CREATE USER 'ssluser'@'192.168.18.129' IDENTIFIED BY 'sslpass';
GRANT REPLICATION SLAVE ON *.* TO 'ssluser'@'192.168.18.129' REQUIRE SSL;
スレーブを更新するには、次のコマンドを使用しています(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;
レプリケーション自体は正常に動作します:
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
これは、マスターとスレーブの両方です。
しかし、私が手動でスレーブからマスターへの接続を確認すると、エラーが発生します。
ここに私がこれまでに試したオプションがあります(みんなから同じ結果です):
[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
再現手順:
注意してください、私は実際にすべての証明書に異なる共通名を使用しました: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
証明書情報:
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
クライアント証明書:
[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
サーバー証明書:
[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
ディレクトリの権限:
マスター上:
[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
スレーブ上:
[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
誰かが解決策を提案できるなら、私はこれを本当に感謝します!
Mysqlユーザーが所有し、他のユーザーが読み取れない証明書ファイルを作成してみてください。
固定暗号で試すこともできます:
mysql ... --ssl-cipher=AES128-SHA
そして変更マスターのために:
CHANGE MASTER TO ... MASTER_SSL_CIPHER='AES128-SHA'
すべてを試してもSSLが機能せず、同時にchrootでmysqldを実行している場合、次のようなエラーの原因は次のとおりです。
ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)
または
ERROR 2026 (HY000): SSL connection error: protocol version mismatch
chroot環境でdev/randomおよびdev/urandomデバイスを作成するのを忘れた可能性があります(openssl libはエントロピーを取得できません-これらのデバイスを開きますafter chroot)。この方法で修正できます(/srv/mysqld
はchroot dirで、mysqld
はmysqldを実行しているユーザーで):
Sudo install -d -o mysqld -g mysqld -m 500 /srv/mysqld/dev
Sudo mknod -m 444 /srv/mysqld/dev/random c 1 8
Sudo mknod -m 444 /srv/mysqld/dev/urandom c 1 9
可能な解決策:
MySQLサーバーがyaSSLまたはOpenSSLを使用しているかどうかを確認する方法
これは、適切なグローバルステータス値がないための回避策を示しています。アイデアはRsa_public_key
ステータス変数:
mysql> show status like '%rsa%';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| Rsa_public_key | |
+----------------+-------+
1 row in set (0.00 sec)
OpenSSLが使用されている場合、その変数は存在します。それ以外の場合はyaSSLです。
MySQLおよびSSL接続でエラーERROR 2026(HY000) (Stack Overflow)が失敗する