Kann keine Verbindung zu MySQL über ein selbstsigniertes SSL-Zertifikat herstellen

15

Nachdem ich ein selbstsigniertes SSL-Zertifikat erstellt habe, habe ich meinen Remote-MySQL-Server so konfiguriert, dass er diese verwendet (und SSL ist aktiviert).

Ich stelle eine SSH-Verbindung zu meinem Remote-Server her und versuche, über SSL eine Verbindung zu seinem eigenen mysqld herzustellen (MySQL-Server ist 5.5.25).

mysql -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key --ssl-ca=ca.cert
Enter password: 
ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)

Ok, ich erinnere mich, dass ich ein Problem mit der Verbindung zum selben Server über SSL gelesen habe. Also lade ich die Client-Schlüssel auf meine lokale Box herunter und teste von dort ...

mysql -h <server> -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key --ssl-ca=ca.cert 
Enter password: 
ERROR 2026 (HY000): SSL connection error

Es ist unklar, worauf sich dieser "SSL-Verbindungsfehler" bezieht, aber wenn ich den weglasse -ssl-ca, kann ich eine Verbindung über SSL herstellen.

mysql -h <server> -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 5.5.25 MySQL Community Server (GPL)

Ich glaube jedoch, dass dies nur die Verbindung verschlüsselt und nicht die Gültigkeit des Zertifikats überprüft (was bedeutet, dass ich potenziell anfällig für Man-in-Middle-Angriffe wäre).

Die SSL-Zertifikate sind gültig (wenn auch selbst signiert) und enthalten keine Passphrase. Meine Frage ist also, was mache ich falsch? Wie kann ich mit einem selbstsignierten Zertifikat eine SSL-Verbindung herstellen?

MySQL Server Version 5.5.25 und der Server und die Clients sind CentOS 5.

Danke für jeden Rat

Bearbeiten : Beachten Sie, dass der Befehl in allen Fällen aus demselben Verzeichnis ausgegeben wird, in dem sich die SSL-Schlüssel befinden (daher kein absoluter Pfad).

Bearbeiten (als Antwort auf mgorven): Dies ca.certist das Zertifikat der Zertifizierungsstelle, das mysql mitteilen soll, dass meine Zertifizierungsstelle vertrauenswürdig ist.

Die Konfig von my.cnfist

[mysqld]
ssl-ca=/etc/ssl/mysql/ca.cert
ssl-cert=/etc/ssl/mysql/server.cert
ssl-key=/etc/ssl/mysql/server.key

Ich habe auch versucht hinzuzufügen ssl-cipher=DHE-RSA-AES256-SHA, habe es aber seitdem entfernt, da es nicht geholfen hat.

carpii
quelle
2
Was ist ca.cert? Ist es das selbstsignierte Zertifikat des Servers? Verwenden Sie Client-Zertifikate zur Authentifizierung? Bitte geben Sie die SSL-bezogene Konfiguration auf dem Server an.
mgorven
Danke, ich habe meine Frage mit Antwort und SSL-Konfiguration vom Server aktualisiert. Die Zertifikate, die beim Verbindungsversuch über die Befehlszeile übergeben werden, sind in der Tat Client-Zertifikate.
carpii
Infact es ist eine gute Frage. Im Nachhinein bin ich mir nicht sicher, ob es Sinn macht, dass der Client die Server ssl-ca angibt. Aber ohne Im unter der Imrepssion wird die verschlüsselte Verbindung nicht streng authentifiziert
carpii

Antworten:

12

Ja, Sie haben Recht, dass --ssl-cader Client das Serverzertifikat überhaupt nicht überprüft , wenn Sie es nicht angeben . Da dies ohne diese Option möglich ist, ist der wahrscheinlichste Grund für den Fehler, dass der Client dem Serverzertifikat nicht vertraut.

Wenn Sie selbstsignierte Client- und Serverzertifikate ca.certverwenden, sollte die Datei beide Dateien enthalten. Auf diese Weise vertraut der Client dem Serverzertifikat und der Server dem Clientzertifikat.

Beispiel:
Generieren Sie den Serverschlüssel und das Zertifikat:

$ openssl req -x509 -newkey rsa:1024 \
         -keyout server-key-enc.pem -out server-cert.pem \
         -subj '/DC=com/DC=example/CN=server' -passout pass:qwerty

$ openssl rsa -in server-key-enc.pem -out server-key.pem \
         -passin pass:qwerty -passout pass:

Generieren Sie den Client-Schlüssel und das Zertifikat:

$ openssl req -x509 -newkey rsa:1024 \
         -keyout client-key-enc.pem -out client-cert.pem \
         -subj '/DC=com/DC=example/CN=client' -passout pass:qwerty

$ openssl rsa -in client-key-enc.pem -out client-key.pem \
         -passin pass:qwerty -passout pass:

Kombinieren Sie die Client- und Serverzertifikate in der CA-Zertifikatsdatei:

$ cat server-cert.pem client-cert.pem > ca.pem
Keith Burdis
quelle
Ich danke dir sehr! Der fehlende Schritt ist, dass ich Server- und Client-Zertifikate nicht zu einem ca.pem verkettet habe. Ich habe stattdessen das CA-Zertifikat übergeben, das ursprünglich generiert wurde (und dann als CA-Schlüssel beim Generieren von Client- und Server-Zertifikaten übergeben wurde)
carpii
Seltsam, aber es hat bei mir immer nur mit einem CA-Zertifikat funktioniert - auf Client und Server gleich.
Dmitry Leskov
Ja, solange für den DN keine besonderen Anforderungen bestehen - beispielsweise, dass der CN ein bestimmter Wert ist - können Sie auf dem Client und dem Server denselben Schlüssel und dasselbe selbstsignierte Zertifikat verwenden.
Keith Burdis
3

Um Einweg-SSL zu verwenden, sollten Sie Folgendes versuchen:

mysql -u <user> -p --ssl=1 --ssl-ca=ca.cert --ssl-verify-server-cert

Die --ssl-certund --ssl-keyauf dem MySQL-Client werden für 2-Wege-SSL verwendet. Dies bedeutet zertifikatsbasierte Authentifizierung. Der Betreff des Client-Zertifikats sollte der Benutzername sein.

Mircea Vutcovici
quelle
2
Beachten Sie außerdem, dass beim Herstellen einer Socket-Verbindung und bei Verwendung --ssl-verify-server-certdes CN das Serverzertifikat mit dem Host identisch sein muss, den Sie für die Befehlszeilenoption -h angegeben haben.
Keith Burdis
0

Haben Sie nicht zufällig denselben allgemeinen Namen für Server- und Client-Zertifikate eingegeben? Wenn ja, ersetzen Sie einen von ihnen, damit die allgemeinen Namen unterschiedlich sind.

Dmitry Leskov
quelle
Für mich hat die Lösung von Dmitry Leskov funktioniert. In der SSL-Dokumentation von MySQL: ( dev.mysql.com/doc/refman/5.0/en/creating-ssl-certs.html ) Client-Zertifikate / -Schlüssel müssen sich jeweils vom Common Name-Wert unterscheiden, der für das CA-Zertifikat verwendet wird. Andernfalls funktionieren die Zertifikat- und Schlüsseldateien nicht für Server, die mit OpenSSL kompiliert wurden. Ein typischer Fehler in diesem Fall ist: FEHLER 2026 (HY000): SSL-Verbindungsfehler: Fehler: 00000001: lib (0): func (0): reason (1)
gmas