Seite 1 von 1

SQL mit SSL. neue Runde

Verfasst: Samstag 8. August 2020, 15:01
von step
Moin,

ich renne mir jetzt drei volle Tage den Kopf daran ein, Jverein mit remote SQL über SSL an den Start zu bekommen.

Ich habe hier auf github schon einiges dazu geschrieben, fasse hier nochmal zusammen.

* Client: Ubuntu mit OpenJRE 8u265-b01-0ubuntu2~16.04
* Server: Debian 10.5 mit mariadb Ver 15.1 Distrib 10.5.4-MariaDB
* Jameica 2.8.6
* jverein 2.8.18

Die Zertifikate habe ich (letztendlich) mit Hilfe eines Skriptes erzeugt, das in dem Thread auf github verlinkt war, man findet es hier: techsparx.com

Anders als in der Anleitung willuhn.de:mysql-ssl musste ich der MySQL/MariaDB-Konfiguration noch eine Variable "ssl-key" bekanntmachen, da (laut SQL-Log) der Server sonst die Krypto nicht aktivieren kann.

Meine JVerein-Konfigurationsdatei ist so wie auf github beschrieben (mit der auf willuhn.de praktisch identisch, habe auch die zusätzlichen SSL-Parameter mal weggelassen, macht keinen Unterschied)

Danach kann mich jetzt mit dem mySQL-Kommandozeilentool vom Client zum Server verbinden,

Code: Alles auswählen

mysql -v -h meinserver.de --port=3306 -u meinuser -p --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem
ein "status;" zeigt dass die Verbindung verschlüsselt ist.

Ich habe dann aus der Jameica-Gui sowohl das "Jameica Certificate (MeinRechnername)" als auch die "Jameica CA" exportiert, nach PEM konvertiert, in einem ca_path abgelegt und diesen ebenfalls dem Server bekannt gemacht.

In die Jameica-GUI importiert habe ich sowohl ca.pem, als auch client-certificate.pem.
Als das nichts geholfen hat habe ich sie auch noch dem "Java Truststore" hinzugefügt, nach der Anleitung auf github.

Leider bleibt eine Verbindung zu JVerein unmöglich. Die GUI sagt "Fehler beim Initialisieren der Datenbank", die auf "TRACE" gestellte LOG-Konsole liefert ein

Code: Alles auswählen

[Sat Aug 08 14:28:52 CEST 2020][ERROR][main][de.jost_net.JVerein.JVereinPlugin.call] Fehler beim Methodenaufruf
java.rmi.RemoteException: connection to database.jdbc:mysql://MeineIP:3306/MeineDBt?useUnicode=Yes&characterEncoding=ISO8859_1&useSSL=true&requireSSL=true&verifyServerCertificate=true failed; nested exception is: 
	com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
... mir fällt nix mehr ein. Ausser ein VPN einzurichten, aber das gibt in der gemischten Linux/Windows-Umgebung unseres Vereins wieder ganz eigene Probleme :/ - vielleicht hat ja noch wer 'ne Idee.

Auf willuhn.de ist noch ein

Code: Alles auswählen

database.driver.mysql.jdbcdriver=org.mariadb.jdbc.Driver
erwähnt den man in der Konfigurationsdatei nennen kann, aber das pfunktioniert bei mir auch nicht, gibt nur einen zusätzlichen
"Hibiscus-Datenbank konnte nicht initialisiert werden, java.lang.ClassNotFoundException..."

vielliecht hat ja jemand noch 'ne Idee, sonst werde ich den Rest meines Urlaubs in der wunderbaren Welt von VPN-Verbindungen zwischen Windowsrechnern und Linux-Servern verbringen :D

Danke, Gruß, Stephan

Re: SQL mit SSL. neue Runde

Verfasst: Samstag 8. August 2020, 15:46
von wpein2m
Hallo Stephan,
ich weiß nicht ob ich Dir helfen kann aber bei uns läuft JVerein eh und je seit bald 3 Jahren mit verschlüsseltem SQL Zugriff.
Zunächst lief die MySQL DB auf einem Raspberry, seit ca. 1 Jahr auf einem virtuellen Ubuntu Server bei 1&1.
Clients laufen hauptsächlich unter Windows und MacOs, testweise hatte ich auch mal Linux laufen (inzwischen aber wieder gelöscht).
Ich nutze Jameica 2.8.1 (andere bei uns im Club wahrscheinlich eine neuere Version) und JVerein 2.8.15.

Ich kann mich erinnern, dass ich zu Beginn viel experimentieren musste, bis es geklappt hat. Dabei habe ich auch Wireshark genutzt und spezielles Augenmerk auf die Zertifikate gerichtet (daran scheitert es zumeist).

Ich könnte Dir ggf. mit Extrakten aus meinen Konfigurationsdateien helfen bzw. mit einem Dokument, welches ich extra erstellt habe für neue Clients!

Gruß

Wolfgang

P.S.: Ich versuche Dir das Dokument per persönlicher Nachricht zu schicken!

Re: SQL mit SSL. neue Runde

Verfasst: Samstag 8. August 2020, 16:57
von step
Es sieht fast so aus als ob Inkompatibilitäten bei SSL/TLS auftreten Ich kann im MariaDB-Server mit den Variablen

Code: Alles auswählen

tls_version
und

Code: Alles auswählen

ssl_cipher
selbige rauf- oder runterzwingen auf Versionen 1.0, 1.1, 1.2 oder 1.3.

Je nachdem auf welche Version ich mich festlege, bekomme ich im Jameica-log im Trace unter dem "Communication link failure" ein

Code: Alles auswählen

Caused by: javax.net.ssl.SSLException: Received fatal alert: protocol_version
oder aber ein

Code: Alles auswählen

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: SSL Connection required, but not supported by server.
ODER

Code: Alles auswählen

Caused by: javax.net.ssl.SSLException: Received fatal alert: internal_error
Funktioneren tut scheinbar keine ...

Re: SQL mit SSL. neue Runde

Verfasst: Sonntag 9. August 2020, 16:45
von step
Ich habe mal mit Wireshark gelauscht, was für Protokollfehler so gibt, je nachdem welche TLS-Versionen bzw. welche Ciphers man in MariaDB mit OpenSSL konfiguriert, und habe das dort zusammengefasst. Es wäre schön wenn sich die Jameica/Jverein-Entwickler mit MariadDB und OpenSSL auseinandersetzen könnten, bzw. wenn der Bug dort liegt diesen näher bestimmen und reporten; denn irgendwie scheint es dort erhebliche Verständigungsschwierigkeiten zu geben, und MariaDB ist immerhin Standard in Debian. Gruß

Re: SQL mit SSL. neue Runde

Verfasst: Samstag 22. August 2020, 16:22
von RuderMarkus
Hallo Stephan,

ich habe seinerzeit auch etwas gebastelt, bis es auf meinem Raspi lief.
Mit der MariaDB gibt es ein paar Besonderheiten, die ich in der Doku nicht gefunden habe.

Folgenden Hinweis habe ich grad in meinen Notizen gefunden:
Lösungsversuch2: Manuell mit MySQL verbinden bei „Require ssl“

Code: Alles auswählen

mysql -h 192.168.178.90 -u jverein -p --ssl --ssl-ca=/etc/mysql/ssl/ca-cert.pem --ssl-cert=/etc/mysql/ssl/client-cert.pem --ssl-key=/etc/mysql/ssl/client-key.pem
Ergebnis: erfolgreich
Lösungsversuch3: Manuell mit MySQL verbinden bei „Require x509“

Code: Alles auswählen

mysql -h 192.168.178.90 -u jverein -p --ssl --ssl-ca=/etc/mysql/ssl/ca-cert.pem --ssl-cert=/etc/mysql/ssl/client-cert.pem --ssl-key=/etc/mysql/ssl/client-key.pem
Ergebnis: erfolgreich



jameica Zertifikat importieren


13. https://www.willuhn.de/wiki/doku.php?id ... :mysql-ssl
Aus JVerein das Stammzertifikat exportieren
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: /etc/mysql/capath

Code: Alles auswählen

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

openssl x509 -in PC.fritz.box-1.crt -inform DER -out PC-Name.pem -outform PEM

openssl x509 -in Jameica_CA-jameica.org.crt -inform DER -out CA-jameica.pem -outform PEM


14. Anpassen der 50-server.cnf:
[mysqld]
...

Code: Alles auswählen

ssl-cert=</pfad/zu/server-cert.pem>
ssl-ca=</pfad/zu/ca-cert.pem>
ssl-capath=/etc/mysql/capath/
Hint/Tip: The ssl-capath has to end with a slash „/“ Refer to: https://jira.mariadb.org/browse/MDEV-14636

Code: Alles auswählen

restart mysql service
systemctl restart mariadb

MySQL Verbindung mit SSL verschlüsseln (MariaDB Anleitung)
Set ssl=on

Code: Alles auswählen

Edit the vi /etc/mysql/mariadb.conf.d/50-server.cnf or /etc/mysql/mariadb.cnf as follows:
$ sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
Set ssl = on

Set permissions to read the certificates for mysql:

Code: Alles auswählen

chown -R mysql:mysql /etc/mysql/ssl
chmod -R 400 /etc/mysql/ssl
Save and close the file. You can restart mariadb as follows:

Code: Alles auswählen

$ sudo /etc/init.d/mysql restart
mySQL> SHOW VARIABLES LIKE 'have_ssl';
Activate SSL Options in 50-server.cnf

Code: Alles auswählen

# For generating SSL certificates you can use for example the GUI tool "tinyca".
#
 ssl-ca=/etc/mysql/ssl/ca-cert.pem
 ssl-cert=/etc/mysql/ssl/server-cert.pem
 ssl-key=/etc/mysql/ssl/server-key.pem
#
# Accept only connections using the latest and most secure TLS protocol version.
# ..when MariaDB is compiled with OpenSSL:
# ssl-cipher=TLSv1.2
# ..when MariaDB is compiled with YaSSL (default in Debian):
 ssl=on

Bis hier sollten das die Einträge sein, die bei mir schlussendlich zum Erfolg geführt haben. Ich hoffe, Du kannst etwas damit anfangen.
Sonst meld dich gerne nochmal.

Gruß
Markus

Re: SQL mit SSL. neue Runde

Verfasst: Samstag 22. August 2020, 16:24
von RuderMarkus
Hier noch die funktionierende Anleitung, mit der ich neue Clients an meine JVerein installation anbinde. Mit YaSSL und Maria DB muss man die Zertifikate verknüpfen.

Vorgehen zur Verteilung der Client-Installation
1. Download und Installation des Java JRE 8 „jre-8u191-windows-x64.exe“ von https://www.oracle.com/technetwork/java ... 33155.html
2. Download von https://www.willuhn.de/products/jameica ... -2.8.2.zip (all-in-one-Version) bzw. Das vorbereitete Paket
- jameica ORV Edit für Änderungsrechte
-jameica ORV readonly für rein lesenden Zugriff
3. Entpacken nach D:\PortableApps\jameica
4. Start von jameica-winxx.exe (xx ist die bit-Version, 32 oder 64)
5. Im ersten Dialogfenster wirst du nach dem Pfad der config gefragt. Dies ist standardmäßig „C:\Dokumente und Einstellungen\<username>.jameica“.
6. Im nächsten Dialog wirst du aufgefordert ein Master-Passwort für Jameica zu vergeben. Wähle hier ein sicheres Passwort
7. Jameica startet ohne Plugins
8. Deaktiviere Online Updates über „Online-Updates nicht verwenden“!
9. Wechsele auf den Reiter „System“ und
a. im Bereich „Installierte SSL Zertifikate“ Rechtsklick auf das Zertifikat mit der Organisation „Jameica Certificate“ und wähle „Exportieren…“
b. Speichere das Zertifikat lokal ab und gib es deinem JVerein Admin.
10. Wähle „Plugins online installieren“
a. Wähle unter „Verfügbare Updates“: jverein.de
b. Wähle Version 2.8.18 und „Installieren…“ Für alle Benutzer verfügbar
c. Wähle unter willuhn.de/extensions „jameica.messaging“ installieren; Für alle Benutzer verfügbar
11. Starte JVerein neu
12. Nach dem Neustart erscheint eine Sicherheitsabfrage, ob Du dem Server-Zertifikat vertrauen möchtest. Bestätige mit „Ja“
13. Ggf. fordert die Windows Defender Firewall dich nun auf den Zugriff von javaw.exe zu erlauben. Bestätige mit „Zugriff zulassen“.
14. Sollte die Meldung kommen „Jameica: Plugin Fehler“ jverein (Fehler beim Initialisieren der Datenbank), dann klappt der Zugriff auf die Datenbank noch nicht. Bitte informiere Deinen Admin darüber
15. Wenn Dein Admin die Zertifikate richtig eingerichet hat, dann solltest du nur die Meldung bekommen, dass Hibiscus das erste Mal gestartet wird.
Die Meldung kannst Du über die beiden Pfeile rechts oben ausblenden.
16. Teste, ob Du unter „Jverein -> Mitglieder“ Informationen abrufen kannst. Wenn ja, sollte alles funktionieren.
17. Damit Du Mails verschicken kannst, muss unter Administration > Einstellungen > Mail das Kennwort des Mailaccounts zweimal eingegeben werden.

Jverein Admin: Zertifikate verketten
a. Kopiere das erhaltene Zertiifkat auf den Server in den Ordner /etc/mysql/capath
b. Putty login auf den Server:
c. openssl x509 -in ClientCert.crt -inform DER -out ClientCert.pem -outform PEM
d. cat first_cert.pem second_cert.pem > combined_cert.pem
e. update /etc/mysql/mariadb.conf.d/50-server.cnf:
ssl-ca=/etc/mysql/capath/combined_cert.pem
f. Restart mariadb service: systemctl restart mariadb

Gruß
Markus