Seite 1 von 1

SSL will nicht

Verfasst: Montag 12. November 2018, 22:48
von RuderMarkus
Hallo zusammen,

ich bekomme die SSL Verschlüsselung nicht ans Laufen :(
Ich nutze MariaDB 10.1.23 mit Raspbian 9.0 auf einem Raspberry 3
Ich habe die Anleitung von Olaf (https://www.willuhn.de/wiki/doku.php?id ... unknown-00) Schritt für Schritt befolgt.
Sobald ich den Wert ssl_cert setze, springt die Variable have_ssl auf DISABLED um.

MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';

Code: Alles auswählen

+---------------------+----------------------------+
| Variable_name       | Value                      |
+---------------------+----------------------------+
| have_openssl        | NO                         |
| have_ssl            | YES                        |
| ssl_ca              | /etc/mysql/ssl/ca-cert.pem |
| ssl_capath          | /etc/mysql/capath          |
| ssl_cert            |                            |
| ssl_cipher          |                            |
| ssl_crl             |                            |
| ssl_crlpath         |                            |
| ssl_key             |                            |
| version_ssl_library | YaSSL 2.4.2                |
+---------------------+----------------------------+

Code: Alles auswählen

MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';
+---------------------+--------------------------------+
| Variable_name       | Value                          |
+---------------------+--------------------------------+
| have_openssl        | NO                             |
| have_ssl            | DISABLED                       |
| ssl_ca              | /etc/mysql/ssl/ca-cert.pem     |
| ssl_capath          | /etc/mysql/capath              |
| ssl_cert            | /etc/mysql/ssl/server-cert.pem |
| ssl_cipher          |                                |
| ssl_crl             |                                |
| ssl_crlpath         |                                |
| ssl_key             |                                |
| version_ssl_library | YaSSL 2.4.2                    |
+---------------------+--------------------------------+
Ich habe verschiedenste Suchen gestartet, um Hinweise zum Debuggung oder Log zu finden. Leider habe ich keine Hinweise auf Logs oder Befehle gefunden, mit denen ich Fehlermeldungen finde und analysieren kann :( Die MariaDB Error Log ist leer. Im JVerein-Log habe ich auch keine Hinweise gefunden.

Sobald ich in der DBservices &requireSSL\=true ergänze, kann die Datenbank nicht mehr initialisiert werden. Eigentlich Logisch ohne Zertifikat. Mit useSSL=true kann die Datenbank noch initialisiert werden, vermutlich durch Fall-back auf unverschlüsselte Verbindung.
Wie kann ich sehen, dass JVerein tatsächlich die SSL Verbindung nutzt?
Eine Abfrage, ob den Server-Cert vertraut werden soll erscheint bei mir nicht. Auch das Importieren der Zertifikate in JVerein war erfolglos.

Hat jemand von Euch eine Idee, woran es noch liegen kann oder wie ich die SSL-Verbindung testen kann?


Danke Euch!

Gruß Markus

Re: SSL will nicht

Verfasst: Dienstag 13. November 2018, 15:29
von wpein2m
Hallo Markus,
grundsätzlich funktioniert die SSL-Verschlüsselung mit JVerein und SQL, sie läuft bei mir in einer ähnlichen Konfiguration wie von Dir beschrieben seit gut 1 1/2 Jahren sehr stabil. Aber ich erinnere mich, dass ich seinerzeit mehrere Probleme lösen musste, die so ähnlich waren wie Deine. Schlussendlich hat es aber funktioniert. Da bei jedem neuen User ein Zertifikat auf dem Raspberry importiert werden muss, habe ich eine kleine Anleitung erstellt (spezifisch für unseren Verein) wie man JVerein bei einem neuen User installiert und konfiguriert und letztlich das (neue) User-Zertifikat auf dem Raspberry installiert.

Ich nutze nicht MariaDB sondern MySQL. Der Raspberry hängt hinter einer Fritzbox, unsere User verbinden sich mit der MySQL-Datenbank per Internet. Dazu muss in der User-JVerein-Konfiguration der Fritzbox-DNS-Name eingegeben werden (am besten von MyFritz) und der Port (bei mir 3306) an den Raspberry weitergeleitet wird. Auf jeden Fall musst Du sicherstellen, dass die SSL/TLS-Pakete auch auf dem Raspberry ankommen. Am besten vorher ein Ping auf den DNS-Namen und auch ein Telnet auf DNS-Namen mit Port 3306. Auf dem Raspberry gibt es m.W. standardmässig keine guten Möglichkeiten zur TCP-Anlayse. Aus meinen Notizen entnehme ich, dass ich damals 3 Varianten probiert habe:

1. Port 3306 temporär auf einen PC umlenken, dort Wireshark
2. tcpdump oder tshark auf Raspberry installieren
3. auf dem Raspberry das Kommando: ss -s ausführen (socket statistics) - da müsste der TCP-Wert hochgehen

Wenn die Pakete ankommen, dann kann es eigentlich nur noch an der SQL-Konfiguration liegen. Ich bin ursprünglich auch der Anleitung von Olaf gefolgt, habe aber in meinen Unterlagen das Kapitel über das Zertifkats-Handling durchgestrichen (also der Teil ab # create CA certificate) und dort einen Hinweis auf ein anderes Dokument notiert, vermutlich weil es (nur?) damit funktioniert hat.

Wichtig auch die SQL User Rights (Grant-Kommando)

Hier der Link zu dem anderen Dokument: https://askubuntu.com/questions/194074/ ... l-in-mysql

Hier der aktuelle Output von show variables like '%ssl%' :

sorry, das muss ich nachreichen, ich habe schon lange nicht mehr das Kommando "mysql" aufgerufen und bekomme neuerdings im Terminal nur nach Aufruf von mysql die Meldung: " ERROR 2026 (HY000): SSL connection error: ASN: after date in the past" - das hatte ich noch nie - JVerein funktioniert aber. Sieht nach einem Problem mit den Zertifikaten aus (ich nutze openssl).

Ich hoffe, das hilft Dir etwas weiter!

Gruß

Wolfgang

Re: SSL will nicht

Verfasst: Dienstag 13. November 2018, 16:18
von wpein2m
Hallo Markus,
ich habe den Fehler gefunden: in meiner MySQl-Konfiguration (Datei: my.cnf) hatte ich unnötigerweise ein Client-Zertifikat für den Raspberry eingetragen, das ist vor 4 Wochen abgelaufen - Zufall, dass ich das heute entdecke. Ich habe es in der Konfiguration jetzt auskommentiert, MySQL neu gestartet, jetzt geht es wieder.

Hier wie versprochen der Output des Kommandos auf dem Raspberry:

mysql> show variables like "%ssl%";
+---------------+-----------------------------+
| Variable_name | Value |
+---------------+-----------------------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /etc/mysql/ca-cert.pem |
| ssl_capath | /etc/mysql/cacerts |
| ssl_cert | /etc/mysql/server-cert2.pem |
| ssl_cipher | |
| ssl_key | /etc/mysql/server-key2.pem |
+---------------+-----------------------------+
7 rows in set (0.01 sec)

ca-cert.pem ist die von mir erzeugte selbst signierte CA (Certification Authority), server-cert2.pem ist das Server-Zertifikat, welches MySQL an den JVerein-Client zurück sendet. Dort müsste beim ersten Mal ein Hinweis auf ein Zertifikat von einer unbekannten CA erscheinen, welches man einfach akzeptiert.

Good luck!

Wolfgang

Re: SSL will nicht

Verfasst: Dienstag 13. November 2018, 20:55
von RuderMarkus
Hallo Wolfgang,
vielen Dank. Freut micht, dass Du Dein abgelaufenes Zertifikat wegen meiner Startprobleme findest ;-)

Leider hilft nichts von dem :( Meine Maria auf Debian arbeitet mit YaSSL, die Config-Dateien sind ähnlich, aber nicht identisch. Ich habe mehrfach verschiedene Anleitungen durchgespielt. Ich bekomme nur leider keine Fehlermeldung (dass ich mich je über Fehlermeldungen freuen würde... :roll: )
Leider stoße ich in Foren immer auf Fragen zu Ubuntu und openSSL und nicht zu MariaDB und YaSSL.

Eigentlich sind MariaDB und mySQL kompatibel und ja anscheinend auch einfach mit SSL eingerichtet.
Das Berechtigungsproblem habe ich auch gelesen, war aber offensichtlich nie ein Thema, weil es keine Fehlermeldung gab.

Der Zugriff über die FritzBox funktioniert. Leider ohne SSL. Daher kann diese noch nicht in den Produktiveinsatz gehen. Sehr schade.

Danke nochmal für Deine Unterstützung. Meine Doku ist mittlerweile auch so durcheinandern, dass ich beten werde, dass ich das System nie neu aufsetzen muss ;-)

Gruß
Markus

Re: SSL will nicht

Verfasst: Dienstag 13. November 2018, 22:25
von wpein2m
Hallo Markus,
schade dass Du nicht weitergekommen bist. Ich erinnere mich, dass ich ziemlich gekämpft habe, bis ich damals OpenSSL mit MySQL auf dem Raspberry unter Raspbian ans Laufen bekommen habe. Also so einfach war das nicht, vor allem wenn das Problem innerhalb des SSL-Tunnels lag und man nicht genau wusste, bei welchem (bereits verschlüsseltem) Paket das Problem auftritt. In anderen Situationen habe ich erlebt, dass es auch schon einmal am Zertifikat selbst lag, weil bestimmte Attribute gefehlt haben und von der Gegenstelle erwartet wurden. Ich glaube ich habe damals sogar Pakete mit Wireshark analysiert (am Anfang habe ich mit Ubuntu auf einem PC gearbeitet). Und bestimmt gibt/gab es bei MySQL log-Einträge, die weiterhelfen.

Ehrlich gesagt habe ich bis heute noch nie von YaSSL gehört. Aber da muss es doch irgendwelche log/trace Möglichkeiten geben?

Wenn ich Dich richtig verstehe, dann klappt ja die Kommunikation ohne SSL. Bist Du Dir aber sicher, dass bei Nutzung von SSL die Anfrage von JVerein (IP-Pkate) wirklich bei Deinem Server ankommt? Hast Du die incoming Pakete von JVerein im tcpdump gesehen (Verbindungsaufbauwunsch)? Falls nein, dann könnte es ja auch ein Firewall-Problem sein! Entweder auf der Fritzbox oder auf dem MariaDB-Server! Welchen Port hast Du denn seitens JVerein eingetragen und ist das der gleiche Port, auf dem der MariaDB-Server hört? In MySQL ist das (standardmässig?) 3306.

Hier zum Vergleich meine JVerein-Client Datei ( de.jost_net.JVerein.rmi.JVereinDBService ) - die 2. und 3. Zeile gehören in eine Zeile:

database.driver=de.jost_net.JVerein.server.DBSupportMySqlImpl
database.driver.mysql.jdbcurl=jdbc\:mysql\://<server DNS name - FritzBox>\:3306/jverein?useUnicode\=Yes&characterEncoding\=ISO8859_1&useSSL\=true
database.driver.mysql.username=<username>
database.driver.mysql.password=<password>
database.driver.mysql.scriptprefix=mysql-

Vielleicht hilft Dir das ja etwas weiter!

Good luck!

Wolfgang

Re: SSL will nicht

Verfasst: Dienstag 13. November 2018, 23:25
von RuderMarkus
Hallo Wolfgang,
na gut zu wissen, dass es mir nicht allein so geht :)
Ich beschreibe mal ausführlicher meine Configuration und den Lösungsweg in der Hoffnung dass ich damit anderen auch helfen kann und keine Details vergessen werden :) Bis hierhin ging die Einrichtung wie am Schnürchen.

Zu YaSSL: In most cases the MariaDB Server is dynamically linked with the relevant TLS library. With Windows binaries and with Debian and Ubuntu when installed from packages, the specific library is yaSSL. On other platforms, the library is OpenSSL. https://mariadb.com/kb/en/library/secur ... overview/
Ich habe nicht Raspbian, sondern DietPi genommen, weil das ein paar sehr nette Features hat, die Raspbian so nicht hat. https://docs.google.com/spreadsheets/d/ ... edit#gid=0

Mit den Traces/Logs stehe ich auch vor einem Rätsel. Die Logs in /var/mysql sind leer und es werden partout keine Fehler ausgeworfen. Habs vorhin zumindest zum 2026 geschafft, viele Treffer, noch mehr Ursachen. Das ist echt frustrierend. Linux habe ich bisher mit Shell aber vor allem Traceability verbunden.

Wenn die Hinweise auf dem Link oben unter TLS Support auf die Anforderungen an die notwendigen Settings liefern würden, wäre ich ja froh, statt dessen nur ein Verweis auf unendliche viele Variablen. Das ist ein unendliches Try and Error.
"When the statement returns a value of DISABLED, it means that the server was compiled with TLS support, but started with it turned off. A value of YES means that it was compiled with the support and started with TLS enabled. A value of NO means that the server build does not support TLS.
In order to enable TLS on a MariaDB server that was compiled with support, you need to start the server with either the ssl system variable or the --ssl option. There are a number of other system variables that you also need to set, such as the path to the certificate, CA file, the cipher you want to use, and so on. For more information on these, see SSL/TLS system variables."

Habe die Verbindung übers Internet ausprobiert und wieder auf meine interne 192.x.x.x IP umgestellt. Ich kann auch mit "mysql --ssl" starten und komme auf die Datenbank, aber über den Rücksprung auf unverschlüsselte Verbindung. Die Abfrage "mysql> status" liefert: ssl not in use.
Remoteverbindung ohne ssl klappt auch von einem anderen Raspi im Heimnetz, sollte also klappen.

Wie sehe ich denn in JVerein dass die Verbindung mit SSL verschlüsselt ist? SSL\=True zwingt nicht zu ssl, sondern lässt einen Fallback zu, wiegt also in trügerischer Sicherheit. Mit diesem Parameter kann ich mich zu JVerein verbinden.
Erzwungen wird SSL mit &requireSSL\=true. Dann bekomme ich den Fehler, dass die JVerein Datenbank nicht initialisiert werden kann.

Von tcpdumps und Wireshark habe ich bisher Abstand genommen, weil ich gehofft hatte irgendwann die Logs zu finden. Ich wollte mich eigentlich nicht in die SSL-Shake-Hands einlesen. Meine Erwartung war hier, dass die Datenbank die entsprechenden Fehler ausgibt: Cert falsch, nicht gefunden,...

Ach ja, die CNs der Zertifikate sind unterschiedlich. Dazu gibts zig Hinweise in Foren. Das dürfte es also auch nicht sein.
Naja, ich werd mal ein wenig sniffen. Heute aber nicht mehr.

Gruß
Markus

Re: SSL will nicht

Verfasst: Mittwoch 14. November 2018, 06:38
von RuderMarkus
Guten Morgen,

Ich habe auf https://maulwuff.de/research/ssl-debugging.html ein paar Hinweise zu SSL/TLS gefunden: das Protokoll ist tricky

Unfortunatly SSL/TLS is a hard to debug protocol because:

Error messages are missing, are not very specific or even hide the real problem.
There are lots of broken configurations and SSL stacks in the wild. And while browsers try to work around it as much as possible the stacks in applications or scripts are mostly not that tolerant.
There are lots of bad tips out there which often only work around the underlying problem by seriously degrading the security of the protocol.
Deeper knowledge of the protocol and standards is necessary to understand and fix most problems instead of applying some insecure workaround found somewhere on the internet.

Ich werd erstmal Wireshark anwerfen und gucken was sich ergibt.

Gruß Markus

Re: SSL will nicht

Verfasst: Mittwoch 14. November 2018, 15:05
von wpein2m
Hallo Markus,
error 2026 deutet auf ein (grundlegendes?) SQL-Problem hin, oftmals fehlerhafte Zertifikate.

Mir scheint, dass Deine MariaDB/YaSSL aus irgendeinem Grunde keine SSL/TLS-Verbindung akzeptiert (Konfigurationsproblem?).
Dann hilft vermutlich auch nicht, wenn JVerein sich richtig per TLS anmeldet.
Ich habe damals nach einem möglichst einfachen SQL-Client (also nicht JVerein) gesucht, der TLS beherrscht,
und den ich zum Testen nutzen kann. Ich habe bestimmt mal Squirrel benutzt, weiss aber nicht (mehr) ob der TLS kann.
Dann gibt es noch HeidiSQL. Ich habe sogar eine app gefunden (von einem spanischen Entwickler), mit der ich mich per
TLS auf die JVerein Datenbank verbinden konnte (MySQL TLS Access) - hat funktioniert (nutze ich aber nicht mehr).

Ob JVerein wirklich eine TLS-Verbindung zu Deinem Server aufbaut, kannst Du m.E. nur mit Wireshark überprüfen.
Wenn Du SSL nicht erzwingst, dann wird vermutlich eine normale Verbindung aufgebaut falls SSL fehlschlägt.
Wenn der Verbindungsversuch per SSL aber erzwungen wird und fehlschlägt, dann kann JVerein keine Verbindung zur DB aufbauen
und kommt mit dieser Allerwelts-Meldung "Kann Datenbank nicht initialisieren" (den Fehler hatte ich schon bei allen
möglichen Ursachen, nicht nur SSL-Fehler).

In Wireshark (Client seitig) solltest Du sehen können, bei welchem Paket der Verbindungsaufbau schiefgeht
(die ersten Pakete sind ja unverschlüsselt). Auf dem Raspberry habe ich nie ein IP-Dump-Tool benutzt (weil ich eher
Windows als Linux-lastig bin und es ja am Ende funktioniert hat). Der Client schickt ein 1. Paket an den DB-Server, der
antwortet mit seinem Server Zertifikat. Ab da geht es verschlüsselt. Man kann in Wireshark auch verschlüsselte
Verbindungen dekodieren, das ist aber sehr mühsam, weil man die verwendeten Schlüssel kennen und eingeben muss.

Hier ist ein Wireshark-Mitschnitt meiner funktionierenden JVerein-TLS-MySQL-Verbindung, vielleicht hilft Dir das ja:
JVerein-Client = 192.168.178.68
Fritzbox = 5.146.89.145

https://www.dropbox.com/s/1h77tdqd6v1oj ... capng?dl=0

In Paket 7 schlägt JVerein TLS v1.1 vor sowie etliche andere Parameter wie z.B. welche cipher suites seitens JVerein
akzeptiert werden (cipher suites = Verschlüsseluungsmethoden z.B. AES 256).
In Paket 9 sieht man, dass der MySQL Server auf TLS 1.0 "herunterhandelt" und als cipher suite gewählt hat:
Cipher Suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x0039)
Außerdem wird das Server Zertifikat übergeben (das kann man sogar im Klartext lesen).

Spätestens ab Paket 18 ist alles verschlüsselt, man sieht nur noch den Header im Klartext.

Good luck!

Wolfgang

Re: SSL will nicht

Verfasst: Donnerstag 10. Januar 2019, 16:25
von akemper
Nachdem ich im Verlauf der Woche mit einigen Startschwierigkeiten auch endlich JVerein + Hibiscus mit einer TLS-gesicherten Datenbank installiert habe hier noch ein paar Anmerkungen:

1. Entscheidend war das nur in Debian Stretch resp. Raspbian 9 mitgelieferte MariaDB (10.1) inkl. YaSSL anstelle von OpenSSL zu verwenden. Ubuntu und die gängigen MySQL / MariaDB Docker Container setzen allesamt auf OpenSSL. Letzteres funktioniert jedoch nicht, da dann jeweils die (Pseudo-) Validierung des selbst-signierten Client-Zertifikates fehlschlägt. Da der Client dies stets mitschickt, muss es auch zwangsweise mit "ssl-capath=..." dem Server bekannt gemacht werden.

2. In der Konfigurationsdatei "/etc/mysql/mariadb.conf.d/50-server.cnf" muss neben den beschriebenen SSL-Einstellungen noch "bind-address=0.0.0.0" gesetzt werden, um einen externen Zugriff für die neu angelegten Datenbanknutzer von außen prinzipiell zu ermöglichen.

3. Parallel zum vorherigen Punkt sollten die externen Nutzer Zugriff nur gesichert per SSL bekommen. Dies erreicht man mit einem "REQUIRE SSL" am Ende der GRANT-Statements für die neu angelegten Datenbanken, z.B. also:

Code: Alles auswählen

GRANT ALL PRIVILEGES ON jverein.* TO 'jverein'@'%' REQUIRE SSL; 

Code: Alles auswählen

GRANT ALL PRIVILEGES ON hibiscus.* TO 'hibiscus'@'%' REQUIRE SSL; 
Ansonsten gerne fragen ;-)

Andreas