MySQL 5.1.66 SSL接続エラーERROR 2026(HY000)


37

更新2

WireSharkを使用して、問題の文字列を見つけました(できたことを願っています)。

28 | 9.582638 | 192.168.18.128 | 192.168.18.129 | MySQL Response Error 1043

そして、エラーは(ドキュメントによると)です:

Error: 1043 SQLSTATE: 08S01 (ER_HANDSHAKE_ERROR)
Message: Bad handshake 

以下は、2つの場合のWireSharkのスクリーンショットです。

Windows 8(成功)からの接続:

ここに画像の説明を入力してください

CentOSからの接続(失敗):

ここに画像の説明を入力してください

なぜこれが起こるのですか?


更新

興味深いの通知:
私は成功したのWindows 8を使用してマスターDBに接続している(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

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

再現する手順:

  1. 同じCAによって署名されたクライアント証明書とサーバー証明書の両方をセットアップ/作成します。
  2. このスレッドで述べたように、クライアントとサーバーでmy.cnfファイルの両方をセットアップします
  3. スレーブのマスターに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

証明書情報:

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

ディレクトリPermissions:

マスターについて:

[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

誰かが解決策を提案できるなら、私は本当に感謝しています!


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
ポールホワイトはGoFundMonicaを言う

回答:


2

mysqlユーザーが所有し、他のユーザーが読み取れない証明書ファイルを作成してみてください。

固定暗号でも試すことができます:

mysql ... --ssl-cipher=AES128-SHA

変更マスターの場合:

CHANGE MASTER TO ... MASTER_SSL_CIPHER='AES128-SHA'


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)

OpenSSLが使用されている場合、その変数は存在します。それ以外の場合は、yaSSLです。

その他の可能性:

MySQLとSSL接続がエラー2026(HY000)に失敗する(スタックオーバーフロー)


1

すべてを試しても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はエントロピーを取得できません-chroot 後にこれらのデバイス開きます)。この方法で修正できます(/srv/mysqldchrootディレクトリとmysqldmysqldを実行しているユーザーに置き換えてください):

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.