UPDATE2
Mit WireShark habe ich den Problemstring herausgefunden (ich hoffe ich habe es getan):
28 | 9.582638 | 192.168.18.128 | 192.168.18.129 | MySQL Response Error 1043
Und der Fehler ist (laut docs ):
Error: 1043 SQLSTATE: 08S01 (ER_HANDSHAKE_ERROR)
Message: Bad handshake
Hier sind die Screenshots von WireShark in zwei Fällen:
Verbindung von Windows 8 (Erfolg):
Verbindung von CentOS (Fail):
Warum passiert das?
AKTUALISIEREN
Ein interessanter Hinweis:
Ich habe unter Windows 8 erfolgreich eine Verbindung zur Master- (192.168.18.1)
Datenbank hergestellt, indem ich die ssluser-Einstellung auf dem Master für den 192.168.18.1
Host geändert habe - eine Änderung vorgenommen: von REQUIRE SSL
nach REQUIRE X509
. Dies funktioniert in unserem Fall jedoch nicht mit einer Slave-zu-Master-Verbindung.
Ich habe ein Problem mit der SSL-Replikation in CentOS-6.3. Ich verwende OpenSSL, um sowohl Client- als auch Serverzertifikate zu erstellen, und sowohl Client- als auch Serverzertifikate werden von derselben Zertifizierungsstelle signiert.
Server IP: 192.168.18.128
Slave IP: 192.168.18.129
MySQL version 5.1.66 SSL
Alle Zertifikate, die ich über den Abschnitt "Einrichten von SSL-Zertifikaten und -Schlüsseln für MySQL" auf den MySQL-Hilfeseiten erhalte .
Die my.cnf- Datei des Servers :
[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
Client my.cnf Datei:
[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
Auf dem Master richte ich einen Slave-Benutzer mit SSL wie folgt ein:
CREATE USER 'ssluser'@'192.168.18.129' IDENTIFIED BY 'sslpass';
GRANT REPLICATION SLAVE ON *.* TO 'ssluser'@'192.168.18.129' REQUIRE SSL;
Um Slave zu aktualisieren verwende ich den folgenden Befehl (laut show master status
Befehl):
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;
Die Replikation selbst funktioniert einwandfrei:
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
Dies gilt sowohl für den Master als auch für den Slave.
Aber wenn ich die Verbindung vom Slave zum Master manuell überprüfe, erhalte ich eine Fehlermeldung.
Hier sind die Optionen, die ich bisher ausprobiert habe (das gleiche Ergebnis von allen):
[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
Schritte zum Reproduzieren:
- Richten Sie sowohl Clients als auch Server-Zertifikate ein, die von denselben signiert sind.
- Richten Sie sowohl my.cnf-Dateien auf Clients als auch auf Servern ein, wie in diesem Thread erwähnt
- erstelle ssluser auf master für slave
- mysql -u ssluser -h 192.168.18.128 -p
Bitte beachten Sie, dass ich in der Tat für alle Zertifikate unterschiedliche Common Names verwendet habe: für CA, Client und Server.
ZUSÄTZLICHE INFORMATION
Überprüfungsergebnisse:
[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
Zertifikatsinformationen:
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
Client-Zertifikat:
[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
Server-Zertifikat:
[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
Verzeichnisse Berechtigungen:
Am Meister:
[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
Auf Slave:
[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
Wenn jemand die Lösung vorschlagen kann, würde ich das wirklich begrüßen!
quelle
Antworten:
Versuchen Sie, Zertifikatsdateien zu erstellen, die MySQL-Benutzern gehören und für andere nicht lesbar sind.
Sie können es auch mit einer festen Chiffre versuchen:
mysql ... --ssl-cipher=AES128-SHA
Und für den Change Master:
CHANGE MASTER TO ... MASTER_SSL_CIPHER='AES128-SHA'
quelle
Mögliche Lösungen:
So stellen Sie fest, ob MySQL Server yaSSL oder OpenSSL verwendet
Dies zeigt eine Problemumgehung für das Fehlen eines geeigneten globalen Statuswerts. Die Idee ist, nach der
Rsa_public_key
Statusvariablen zu suchen:Wenn OpenSSL verwendet wird, ist diese Variable vorhanden. sonst ist es yaSSL.
Andere Möglichkeit:
MySQL- und SSL-Verbindung fehlgeschlagen. FEHLER 2026 (HY000) ( Stapelüberlauf )
quelle
Wenn Sie alles versucht haben, aber SSL nicht funktioniert und Sie gleichzeitig mysqld in chroot ausführen, ist die Ursache für die Fehler folgende:
oder
Möglicherweise haben Sie vergessen, dev / random- und dev / urandom-Geräte in der chroot-Umgebung zu erstellen (und openssl lib kann keine Entropie abrufen - diese Geräte werden nach chroot geöffnet ). Sie können dies folgendermaßen beheben (ersetzen Sie es
/srv/mysqld
durch Ihr Chroot-mysqld
Verzeichnis und durch den Benutzer, unter dem mysqld ausgeführt wird):quelle