Kann OpenSSL zum Debuggen einer SSL-Verbindung zu einem MySQL-Server verwendet werden?

20

Ich möchte, dass mein Webserver über eine SSL-Verbindung mit dem MySQL-Datenbankserver spricht. Auf dem Webserver läuft CentOS5, auf dem Datenbankserver läuft FreeBSD. Die Zertifikate werden von einer zwischengeschalteten CA DigiCert bereitgestellt.

MySQL sollte SSL verwenden, entsprechend my.cnf:

# The MySQL server
[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
ssl
ssl-capath = /opt/mysql/pki/CA
ssl-cert = /opt/mysql/pki/server-cert.pem
ssl-key = /opt/mysql/pki/server-key.pem

Wenn ich MySQL starte, startet der Daemon ohne Fehler. Dies deutet darauf hin, dass alle Zertifikatdateien lesbar sind.

Wenn ich jedoch versuche, eine Verbindung vom Webserver zum Datenbankserver herzustellen, erhalte ich eine Fehlermeldung:

[root@webserver ~]# mysql -h mysql.example.org -u user -p
ERROR 2026 (HY000): SSL connection error

Und wenn ich versuche, mit openssl weiter zu debuggen:

[root@webserver ~]# openssl s_client -connect mysql.example.org:3306 0>/dev/null
CONNECTED(00000003)
15706:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:588:

Ist dies eine gültige Methode zum Testen der SSL-Verbindung zu einem MySQL-Datenbankserver? Die SSL23_GET_SERVER_HELLO:unknown protocolMeldung ist seltsam, da dies normalerweise der Fall ist, wenn Sie SSL an einem für Nicht-SSL-Datenverkehr bestimmten Port sprechen.

Dieser Befehl openssl funktioniert anscheinend auch mit LDAP- und HTTP-Servern:

$ openssl s_client -connect ldap.example.org:636  0>/dev/null
CONNECTED(00000003)
depth=2 /C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
...
$ openssl s_client -connect www.example.org:443  0>/dev/null
CONNECTED(00000003)
depth=0 /DC=org/DC=example/OU=Services/CN=www.example.org
Stefan Lasiewski
quelle

Antworten:

10

OpenSSL Version 1.1.1 (veröffentlicht am 11. September 2018) fügte die Unterstützung für -starttls mysqlin commit a2d9cfbac5d87b03496d62079aef01c601193b58 hinzu . Leider kann ich den Verweis auf diese neue Funktion nicht im OpenSSL-Changelog finden.

Wenn Ihre Distribution diese Version noch nicht hat, gibt es eine statisch kompilierte openssl-Binärdatei unter https://testssl.sh/openssl-1.0.2k-dev-chacha.pm.ipv6.Linux+FreeBSD.tar.gz, die dies unterstützt -starttls mysql. Den Verweis darauf habe ich in http://www.danneman.org/presentations/Automating_TLS_Configuration_Verification.pdf gefunden .

Für Windows finden Sie die OpenSSL 1.1.1-Binärdateien unter https://wiki.openssl.org/index.php/Binaries

Ich habe die SSL-Zertifikate wie in https://dev.mysql.com/doc/refman/5.7/de/creating-ssl-files-using-openssl.html beschrieben generiert , ausprobiert und es funktioniert:

$ echo | bin/openssl.Linux.x86_64.static s_client -starttls mysql -connect spx-bionic.censored.com:3306 -CAfile /tmp/ca.pem
CONNECTED(00000003)
depth=1 C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = mysql test CA
verify return:1
depth=0 C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = spx-bionic.censored.com
verify return:1
---
Certificate chain
 0 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=spx-bionic.censored.com
   i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
 1 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
   i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
---
Server certificate
-----BEGIN CERTIFICATE-----
CENSORED
-----END CERTIFICATE-----
subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=spx-bionic.censored.com
issuer=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
---
No client certificate CA names sent
Client Certificate Types: RSA sign, DSA sign, ECDSA sign
Requested Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
Shared Requested Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
Peer signing digest: SHA512
Server Temp Key: ECDH, P-521, 521 bits
---
SSL handshake has read 2599 bytes and written 632 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: AD25B7C3018E4715F262188D982AAE141A232712316E0A3292B0C14178E0F505
    Session-ID-ctx: 
    Master-Key: C121967E8FAEC4D0E0157419000660434D415251B0281CCBFC6D7A2AE8B0CC63AEFE22B332E91D31424C1BF03E5AF319
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - 82 db 03 0f c0 ce f2 26-62 bd 1b 18 71 03 88 db   .......&b...q...
    0010 - a6 66 7c 71 94 0c d5 ec-96 30 46 53 4a e6 cd 76   .f|q.....0FSJ..v
    0020 - 66 b3 22 86 7d 9f 7e 2c-14 1d 66 f2 46 8f d2 d3   f.".}.~,..f.F...
    0030 - f7 0a 0b f5 9e 05 97 e1-2b b3 ba 79 78 16 b8 59   ........+..yx..Y
    0040 - dc c5 0d a8 de 0b 3a df-4b ec f9 73 3f 4c c3 f1   ......:.K..s?L..
    0050 - 86 b6 f7 aa a7 92 84 77-9f 09 b2 cc 5d dd 35 41   .......w....].5A
    0060 - 23 5d 77 74 e1 96 91 ac-28 81 aa 83 fe fc d2 3c   #]wt....(......<
    0070 - f9 23 09 6d 00 e0 da ef-48 69 92 48 54 61 69 e8   .#.m....Hi.HTai.
    0080 - 30 0e 1f 49 7d 08 63 9e-91 70 fc 00 9f cd fe 51   0..I}.c..p.....Q
    0090 - 66 33 61 24 42 8f c2 16-57 54 48 ec 6a 87 dc 50   f3a$B...WTH.j..P

    Start Time: 1537350458
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
DONE

Es gibt auch -starttlsUnterstützung für Postgres und LDAP in OpenSSL 1.1.1. Die vollständige Liste finden Sie unter https://github.com/openssl/openssl/blob/OpenSSL_1_1_1-stable/apps/s_client.c#L812-L828 .

Paul Tobias
quelle
12

Beantwortung meiner eigenen Frage. Wenn Sie eine bessere Antwort mit guten, maßgeblichen Quellen haben, senden Sie bitte eine Antwort.

Kurze Antwort; Nein, OpenSSL kann nicht zum Debuggen von MySQL-SSL-Verbindungen verwendet werden. Dies liegt daran, dass MySQL die Sitzung mit Klartext startet und anschließend auf SSL umschaltet.

Beim Lesen von https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_phase.html beginnt MySQL mit einer Klartextverbindung, und anschließend wird das eigentliche SSL initiiert. Dies erklärt, wie MySQL an einem Port (Port 3306) sowohl auf Klartext- als auch auf verschlüsselte Verbindungen lauschen kann. Vergleichen Sie dies mit einem HTTP- oder LDAP-Server, bei dem ein Port für Klartextverbindungen und ein zweiter Port für verschlüsselte Verbindungen verwendet wird.

Es beginnt damit, dass der Client eine Verbindung zum Server herstellt (), der möglicherweise ein ERR-Paket sendet und den Handshake beendet oder ein erstes Handshake-Paket sendet, das der Client mit einem Handshake-Antwortpaket beantwortet. Zu diesem Zeitpunkt kann der Client eine SSL-Verbindung anfordern. In diesem Fall wird ein SSL-Kommunikationskanal eingerichtet, bevor der Client seine Authentifizierungsantwort sendet

Stefan Lasiewski
quelle
1
Dies ist das Gleiche wie SMTP, wenn Sie STARTTLS verwenden, und es ermöglicht Ihnen auch, verschlüsselte und unverschlüsselte Verbindungen auf demselben Port zu verwenden.
Synchro
Hm, ich nehme an, das Verhalten, über das ich spreche, ist laut en.wikipedia.org/wiki/STARTTLS die Funktionsweise von STARTTLS .
Stefan Lasiewski
2
Während MySQL " wie STARTTLS" funktioniert, implementiert es STARTTLS nicht, zumindest nicht in einer Weise, mit der OpenSSL erfolgreich interagieren kann.
Christopher Schultz
2

Eine häufige Ursache für dieses Problem ist, dass der Common Name (CN) des CA-Zertifikats mit dem Server- und / oder Client-Zertifikat identisch ist.

Siehe hier: https://dev.mysql.com/doc/refman/5.6/de/creating-ssl-certs.html

Versuchen Sie, Ihre Zertifizierungsstelle und Zertifikate neu zu erstellen, und stellen Sie in allen Fällen sicher, dass Sie eine eindeutige CN verwenden.

Trent Lloyd
quelle
0

Ich habe ein ähnliches Problem mit dem MacOS X-Client, der mit einem Ubuntu-Server kommuniziert.

Können Sie überprüfen, ob die Verbindung funktioniert, wenn Sie das clientseitige Zertifikat und den Clientschlüssel weglassen und nur die Zertifizierungsstelle für das Serverzertifikat haben? Können Sie eine verschlüsselte Verbindung herstellen? Dies erfordert normalerweise die Einstellung ANY für die Spalte ssl_type des zugeordneten Benutzers.

user1204270
quelle
0

Ich wollte nur zur Erinnerung sagen, dass Sie, wenn Sie einen Load Balancer (wie F5 oder HAProxy) zwischen MySQL und dem Client verwenden möchten, Ihr SSL-Zertifikat vom Load Balancer in den MySQL-Server importieren möchten. Dies liegt am STARTTLS-ähnlichen Verbindungsstart.

Stephen
quelle