Benutzer-Werkzeuge

Webseiten-Werkzeuge


support:mysql-ssl

MySQL über SSL verschlüsseln



Hinweis

Diese Anleitung funktioniert nur mit Jameica 1.10/Hibiscus 1.12 (oder höher). In Jameica 1.9 werden Zertifikate noch anders behandelt, was dazu führt, dass in Jameica importierten SSL-Zertifikate des MySQL-Servers nicht vom Datenbank-Treiber gefunden werden. Siehe auch Bug 872



Dank der Anleitung wie man Hibiscus mit MySQL verkuppelt, kam mir natürlich sofort die Idee, meine Hibiscusdaten auf meinen im ungeschützten Internet befindlichen Server abzulagern. Dies hat den Vorteil, von verschiedenen unabhängigen Orten jameica nutzen zu können und bei einem Unfall am lokalen PC die Daten weiternutzen zu können.

Leider ist der Datenaustausch, wie auch in obiger Anleitung erwähnt, nicht sehr sicher. Soll heissen überhaupt nicht. Doch ganz am Ende der Anleitung steht der Hinweis, die Verbindung doch per SSL zu verschlüsseln. Nach 3 Tagen basteln, probieren und fluchen möchte ich nun diesen noch sehr spärlich dokumentierten Teil der Arbeit hier erläutern.

<<<<<HINWEISE>>>>>
Die Geschwindigkeit des Datenaustauschs zwischen Server und Client ist von Haus aus viel 
geringer als bei einer lokalen Installation. SSL verlängert die Wartezeit noch weiter. 
Diese Lösung ist also NICHTS für Ungeduldige!
-----------------------------------------------------------------------------------
Bei Parallelnutzung mit RDH Schlüssel ist darauf zu achten, dass der Schlüssel bei 
JEDEM Client derselbe ist. Dies schafft man indem der Schlüssel pet Disk oder USB Stick
von PC zu PC transportiert wird. Mehrere jameica Kopien sollten NIE GLEICHZEITIG auf die DB
zugreifen. (Dank an dieser Stelle geht an Willuhn, das Genie dass hinter dem ganzen Projekt
steckt, für den Tipp)

Vorraussetzungen

  • Ein MySQL Server (getestet mit 5.0.x) mit aktiviertem SSL
  • jameica + Hibiscus plugin auf dem PC extrahiert
  • Java mit dem Tool „keytool“ (z.B. Sun Java 1.6.x, JRE oder JDK)
  • (optional) ein SSH Client (z.B. putty für Windows)

Schritte

Hier nun die Schritte wie sie durchgeführt werden müssen damit die SSL Verbindung zustande kommt.

1. jameica Zertifikat exportieren

Bevor wir anfangen, müssen wir das Zertifikat, welches jameica selbst erstellt, exportieren. Dieses benötigen wir für später beim MySQL Server. Dazu startet wir jameica. jameica sollte bereits so konfiguriert sein, dass es auf die Datenbank zugreift. Nachdem jameica gestartet wurde gehen wir über

Datei -> Einstellungen

auf die Seite der Konfigurationen. Dort gibt es einen Abschnitt „Installierte SSL-Zertifikate“. Er enthält bisher 1 Eintrag, das von jameica erstellte Stammzertifikat.

Das Stammzertifikat wird mit Rechtsklick -> "Exportieren" an einen Ort auf der Festplatte exportiert.

2. MySQL konfigurieren

Befindet sich der MySQL server auf einem remote Rechner mit SSH server kommt an dieser Stelle der SSH client zum Einsatz. Wir verbinden uns mit unserem Server und arbeiten mit der Konsole weiter. Andernfalls sind die folgenden Schritte direkt am lokalen PC zu erledigen.

Ist der MySQL Server SSL tauglich?

Diese Frage lässt sich recht schnell beantworten. Wir bauen eine Verbindung zum MySQL Server auf. Im Falle einer Linux remote Maschine wäre das der Befehl:

shell:> mysql -u <Benutzer> -p <passwort>

Alternativ dazu kann man auch den in den GUI tools befindlichen MySQL Administrator verwenden. Wir fokusieren uns hier weiter auf die Linux shell, da dieser Guide fortgeschrittene Kentnisse im Umgang mit MySQL und remote Maschinen erwartet :-P Man setzt nun folgenden Befehl ab

SHOW VARIABLES LIKE '%ssl%';

Unter anderem sollte dabei auch eine Variable namens HAVE_OPENSSL erscheinen.

Wert Bedeutung
NO SSL ist NICHT integriert.
DISABLED SSL ist integriert aber nicht aktiv.
YES SSL ist bereits konfiguriert.

Wir gehen an dieser Stelle von DISABLED oder YES aus. Falls der Wert auf NO steht, muss MySQL ggf neu kompiliert werden bzw eine andere Version heruntergeladen werden.

MySQL unterstützt SSL

MySQL Zertifikate erstellen

Als nächstes erstellen wir folgendes für dem MySQL Server:

  • ein Stammzertifikat welches als Herrausgeber dient für das eigentliche
  • Zertifikat des Servers. Dies ist quasi die Erkennungsurkunde.

Dies geschieht recht schnell durch ein paar Befehle mit dem tool openSSL welches auf fast jeder Linux Distribution zu finden ist. Wir gehen dazu in ein Verzeichnis in dem die Zertifikate liegen sollen. (Der folgende Text ist kopiert von hier)

# Create CA certificate
shell> openssl genrsa 2048 > ca-key.pem
shell> openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem
# Create server certificate
shell> openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem
shell> openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem

Anschliessend haben wir 2 wichtige Dateien: ca-cert.pem, das Stammzertifikat und server-cert.pem, das Serverzertifikat. Diese werden nun beide in die Konfiguration des MySQSL Servers aufgenommen. Dazu

editieren wir die Datei /etc/mysql/my.cnf (als root user, Datei liegt ggf an anderem Ort, abhängig von der Distribution).

Dort fügen wir folgende Einträge hinzu:

[mysqld]
...
ssl-cert=</pfad/zu/server-cert.pem>
ssl-ca=</pfad/zu/ca-cert.pem>
ssl-capath=</pfad/zu/einem/leeren/dir>
jameica Zertifikat importieren

Wir haben in Schritt 1 das jameica Stammzertifikat exportiert. Dieses muss dem MySQL Server als vertrauenswürdiges Zertifikat gegeben werden damit dieser unsere Verbindung nachher auch akzeptiert. Dazu kopieren wir das Zertifikat zertifikatname.crt in das Verzeichnis /pfad/zu/einem/leeren/dir wie 3 Zeilen höher erwähnt. Dort führen wir folgenden Befehl aus:

openssl x509 -in <zertifikat.crt> -inform DER -out <sinnvollername.pem> -outform PEM

Dieser wandelt das jameica Zertifikat in ein für MySQL lesbares Format um.

<<<<HINWEIS>>>>
Dieser Schritt muss für jedes Zertifikat einer jameica Installation 
an einem anderen Ort gemacht werden. Jedesmal muss ein anderer Name 
für die PEM Datei gewählt werden.

Damit kennt der MySQL Server nun alle Zertifikate die unsere jameica PCs nutzen werden um sich bei ihm anzumelden und vertraut diesen. Der Server hat selbst ebenfalls ein Zertifikat mit dem er sich bei unseren jameicas identifizieren wird.

3. jameica konfigurieren

Hinweis Es folgt zuerst die einfache und dann die komplizierte Variante, in jameica den MySQL Server bekannt zu machen. Ich kann nicht genau sagen, seit welcher Version die einfache Variante funktioniert, sie tut es definitiv seit Hibiscus 1.12 und Jameica 1.10.

Einfach

jameica starten. Beim ersten Start fragt uns jameica, ob wir dem Zertifikat vertrauen wollen, mit welchem sich der MySQL Server anmeldet. Wir stimmen zu. Dieser Schritt ist nur 1x notwendig.

Kompliziert

Die Datei ca-cert.pem, welche wir vorhin erstellt haben, kopieren wir an dieser Stelle auf unseren lokalen PC. Das kann per FTP, per SFTP oder ähnlichem passieren und wird hier nicht näher erläutert. Sie ist das Stammzertifikat des MySQL Servers. Der Server wird mit seinem eigenen Zertifikat versuchen, sich bei jameica zu idetifizieren. Damit dies auch klappt, fügen wir in jameica die ca-cert.pem hinzu. Somit glaubt jameica allen Zertifikatsträgern, die ihres bei diesem Stammzertifikat haben erstellen lassen. Verstanden? Nicht so wichtig :-)

Wir starten jameica und gehen erneut in die Einstellungen

Datei -> Einstellungen

Dort klicken wir auf

Zertifikat importieren

und wählen die herüberkopierte ca-cert.pem aus. jameica fragt uns, ob wir dieser Zertifikatsstelle wirklich trauen. Dem ist so, also JA klicken.

Zum Schluss...

…noch 1 wichtiger Schritt ohne den das Ganze für die Katz' ist.

Um jameica dazu zu bringen, SSL zu nutzen, muss die aus der Anleitung genannte Datei „de.willuhn.jameica.hbci.rmi.HBCIDBService.properties“ geändert werden. Folgende Zeile passen wir an:

database.driver.mysql.jdbcurl=jdbc\:mysql\://SERVERIP\:3306/DBNAME?useUnicode\=Yes&characterEncoding\=ISO8859_1

indem wir

&useSSL\=true

anhängen. Danach sieht die Zeile wie folgt aus:

database.driver.mysql.jdbcurl=jdbc\:mysql\://SERVERIP\:3306/DBNAME?useUnicode\=Yes&characterEncoding\=ISO8859_1&useSSL\=true

Mit der bisherigen Konfiguration fällt Jameica in den ungesicherten Modus zurück, wenn der Server kein SSL kann. Um ganz sicher zu gehen, dass SSL benutzt wird, können wir Hibiscus zwingen, mittels SSL zu kommunizieren. Dazu hängen wir noch einen Parameter an:

&requireSSL\=true

Das bedeutet dann:

database.driver.mysql.jdbcurl=jdbc\:mysql\://SERVERIP\:3306/DBNAME?useUnicode\=Yes&characterEncoding\=ISO8859_1&useSSL\=true&requireSSL\=true

Sollte der MySQL Server dann noch ohne SSL laufen, werden wir beim Starten von Jameica/Hibiscus einen Verbindungsfehler bekommen.

Zusammenfassung

Zur Übersicht noch einmal die Arbeitsschritte in Kurzfassung:

  1. MySQL Server auf Tauglichkeit prüfen
  2. per openSSL ein Serverstammzertifikat und ein Serverzertifikat erstellen
  3. MySQL Serverkonfiguration anpassen
  4. das jameica Stammzertifikat exportieren
  5. das jameica Stammzertifikat auf dem MySQL PC in das PEM Format umwandeln und in das bei ssl-capath angegebene Verzeichnis kopieren
  6. das Serverstammzertifikat in jameica importieren
  7. jameica auf SSL Betrieb umstellen

Das war's. Nun könnt ihr an verschiedenen Plätzen jameica nutzen, alle mit derselben Datenbank. Alle mit SSL abgesichert. Oder ihr bleibt bei der jameica-auf-USB-Stick Methode ;-)

Bekannte Fehler

SSLException 'Unsupported record version Unknown-0.0'

Dieser Fehler entsteht, wenn das jameica-Zertifikat nicht beim MySQL Server hinterlegt ist. Eine etwas irreführende Fehlermeldung, aber einfache Lösung. Siehe Abschnitt 'jameica Zertifikat importieren'.

Der Author 2012/10/17 13:58

support/mysql-ssl.txt · Zuletzt geändert: d.m.Y H:i von dawnstrider