Inhaltsverzeichnis
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
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 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&serverTimezone=Europe/Paris
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&serverTimezone=Europe/Paris&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&serverTimezone=Europe/Paris&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:
- MySQL Server auf Tauglichkeit prüfen
- per openSSL ein Serverstammzertifikat und ein Serverzertifikat erstellen
- MySQL Serverkonfiguration anpassen
- das jameica Stammzertifikat exportieren
- das jameica Stammzertifikat auf dem MySQL PC in das PEM Format umwandeln und in das bei ssl-capath angegebene Verzeichnis kopieren
- das Serverstammzertifikat in jameica importieren
- 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
Impressum | Datenschutz