#!/coding/blatt
Sammelsurium mit Schwerpunkten Linux & IT-Sicherheit

Raspberry Pi: Radicale als CalDAV-/CardDAV-Server einrichten und Kalender- & Kontaktdaten synchronisieren

Radicale ist ein Open-Source CalDAV-/CardDAV-Server. Dieser läuft in meinem Heimnetzwerk auf einem Raspberry Pi und lässt mich meine Kalender-/Kontaktdaten einfach sowie sicher zwischen meinen Geräten, wie z.B. Notebook, Smartphone und Tablet, synchronisieren. Meine Wahl viel dabei auf Radicale, weil es sich dabei um einen kleinen und ressourcenschonenden CalDAV-/CardDAV-Server handelt, bei dem es sich um keine aufgeblähte All-In-One-Lösung, wie bspw. Nextcloud, handelt, die noch diverse Features mitliefert, die ich sowieso nicht benötige. Wie ihr Radicale auf einem Raspberry Pi einrichtet und eure Kalender- als auch Kontaktdaten mittels HTTPS und eigenem X.509-Zertifkat (TLS-/SSL-Zertifikat) verschlüsselt synchronisert, erfahrt ihr in diesem Beitrag.

Folgende Hardware bzw. Software wurde verwendet:
  • Notebook mit Arch Linux
  • Raspberry Pi 3B+ mit Raspberry Pi OS Lite (Release vom 04. April 2022)
  • Radicale v3.0.6
  • OpenSSL v1.1.1n
  • Smartphone mit LineageOS v19
  • DAVx5 v4.2.0.3-ose (F-Droid-Version)
  • Etar v1.0.30 (F-Droid-Version)

Voraussetzungen & Zielstellung

Um dem Beitrag folgen zu können, setze ich voraus, dass ihr einen Raspberry Pi mit Raspberry Pi OS habt, mit dem ihr euch in eurem Heimnetzerk per SSH verbinden könnt. Mein Raspberry Pi ist bspw. für diesen Beitrag über den Netzwerknamen raspberrypi.lan sowie der IP-Adresse 192.168.6.238 erreichbar.

Ziel des Beitrags ist es, dass ihr eure Kalender- sowie Kontaktdaten mittels Radicale selber hostet und zwischen euren Endgeräten innerhalb eures Heimnetzwerks synchronsieren könnt. Trotz Heinetzwerk soll die Kommunikation dabei verschlüsselt zwischen Server und Geräten stattfinden. Diesbzgl. zeige ich euch, wie ihr hierfür ein eigenes X.509-Zertifikat generieren und Radicale entsprechend zur Verwendung von SSL konfigurieren könnt. An einem Beispiel gehe ich zudem darauf ein, wie die Synchronisation von Kalenderdaten unter einem Android-Gerät mithilfe der Apps DAVx5 und Etar funktioniert.

Radicale - Funktionen & Merkmale

Radicale ist ein in Python geschriebener CalDAV-/CardDAV-Server und bietet bspw. folgende Funktionen & Merkmale:

  • Kalender- und Kontaktdaten lassen sich per CalDAV, CardDAV bzw. HTTP teilen und synchroniseren.
  • Wird von allen gängigen CalDAV-/CardDAV-Clients unterstützt.
  • Zugriff kann per Benutzer-Authentifizierung auf Basis von htpasswd eingeschränkt werden.
  • Kommunikation zwischen Radicale-Server und Endgeräten kann mittels HTTPS bzw. TLS-Verschlüsselung abgesichert werden.
  • Radicale ist leicht zu konfigurieren und ist relativ ressourcenschonend.
  • Benötigt keine extra Datenbank, da die Daten in einfacher Struktur auf Dateisystemebene gespeichert werden.
  • Bei Bedarf leicht erweiterbar durch Plugins.
  • Open-Source, so dass der Quellcode einsehbar und überprüfbar ist.

Radicale installieren & einrichten

Im ersten Schritt muss Radicale auf dem Raspberry Pi installiert werden. Dazu verbindet euch per SSH mit eurem Raspberry Pi und installiert Radicale wie folgt:

sudo apt install radicale apache2-utils
Terminal / Konsole

Durch die Installation wurde in eurem System ein neuer Benutzer namens radicale angelegt. Die Daten speichert Radicale, wenn nicht anders konfiguriert, im Verzeichnis /var/lib/radicale/collections. Um sicherzustellen, dass die Verzeichnisrechte korrekt gesetzt sind, setzen wir diese noch einmal explizit:

sudo chown -R radicale:radicale /var/lib/radicale/collections
sudo chmod -R o= /var/lib/radicale/collections
Terminal / Konsole

Server-Adresse/-Port festlegen

Von Haus aus würde der Radicale-Server nur auf localhost:5232 lauschen. Damit dieser innerhalb eures Heimnetzwerks erreichbar ist, müsst ihr die IP-Adresse oder den dazugehörigen Hostnamen eures Raspberry Pis in der Konfigurationsdatei im Bereich [server] angeben. Passt die /etc/radicale/config also entsprechend an:

hosts = raspberrypi.lan:5232
Datei: /etc/radicale/config

Benutzer-Authentifizierung einrichten

Standardmäßig ist der Zugriff auf die Kalender-/Kontaktdaten uneingeschränkt möglich. Zur Sicherheit solltet ihr deshalb die Benutzer-Authentifizierung via htpasswd aktivieren. Hierfür legt ihr als erstes einen neuen Benutzer inkl. Passwort mit folgendem Befehl an:

sudo htpasswd -c -B /etc/radicale/users sl
Terminal / Konsole

Öffnet wieder die Konfigurationsdatei und aktiviert die Benutzer-Authentifizierung im Bereich [auth]:

type = htpasswd
htpasswd_filename = /etc/radicale/users
htpasswd_encryption = bcrypt
Datei: /etc/radicale/config

HTTPS mittels eigenem X.509-Zertifikat einrichten

Auch für den Fall, dass eurer Raspberry Pi und somit der Radicale-Server nur innerhalb eures Heimnetzwerks erreichbar ist, ist es anzuraten, die Kommunikation zwischen Server und Endgeräten zu verschlüsseln. Hierfür benötigt ihr ein X.509-Zertifikat (SSL-/TLS-Zertifikat). Im Folgenden werden ihr dazu ein eigenes Zertifikat inkl. eigener Certificate Authority (CA) erstellen und mit der CA das Radicale-Server-Zertifikat signieren.

CA und Zertifikate erstellen

Als erstes generiert einen privaten Schlüssel sowie ein dazugehöriges CA-/Root-Zertifikat für die CA:

openssl genrsa -aes256 -out root-ca.key 4096
openssl req -x509 -new -sha256 -extensions v3_ca -days 3652 -key root-ca.key -out root-ca.crt
Terminal / Konsole

Danach erfolgt die Generierung des eigentlichen Serverzertifikats. Dazu erstellt zuvor noch eine Datei v3-ext.config mit folgendem Inhalt:

basicConstraints = critical,CA:false
subjectAltName   = DNS:raspberrypi.lan, IP:192.168.6.238
Datei: v3-ext.config

Die eigentliche Generierung des Serverzertifikats erfolgt dann wie folgt:

openssl genrsa -out raspberrypi.lan.key 4096
openssl req -new -sha256 -extensions v3_req -key raspberrypi.lan.key -out raspberrypi.lan.csr
openssl x509 -req -in raspberrypi.lan.csr -CA root-ca.crt -CAkey root-ca.key -CAcreateserial -out raspberrypi.lan.crt -extfile v3-ext.config
Terminal / Konsole

Wichtig ist, dass ihr bei der Generierung des Serverzertifikats bei der CN-Abfrage den gleichen Wert verwendet, der auch in v3-ext.config unter DNS hinterlegt ist. In meinem Fall wäre das also raspberrypi.lan. Zum Überprüfen, ob alle Metadaten des Zertifikats richtig hinterlegt sind, könnt ihr folgenden Befehl zur Anzeige des Zertifikats verwenden:

openssl x509 -in raspberrypi.lan.crt -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        [...]
        Subject: C = DE, ST = Some-State, O = SL, CN = raspberrypi.lan
        [...]
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Subject Alternative Name:
                DNS:raspberrypi.lan, IP Address:192.168.6.238
    Signature Algorithm: sha256WithRSAEncryption
    [...]
Terminal / Konsole

Wenn ihr später die Zertifikate auf euren Endgeräten importiert, ist es empfehlenswert die "Fingerprints" zu vergleichen. Um die SHA256-Fingeprints eurer Zertifikate anzuzeigen, dient folgender Befehl:

openssl x509 -in root-ca.crt -noout -fingerprint -sha256
openssl x509 -in raspberrypi.lan.crt -noout -fingerprint -sha256
Terminal / Konsole
Hinweis CA/Zertifikate offline generieren

Aus Sicherheitsgründen ist es anzuraten, CA/Zertifikate "offline" zu generieren, bspw. mit einem Live-System, und die privaten Schlüssel auf einem externen Speichermedium offline verschlüsselt wegzuspeichern.

Zertifikate hinterlegen & einrichten

Nachdem nun das Serverzertifikat erstellt ist, hinterlegt es auf eurem Raspberry Pi wie folgt:

  • raspberrypi.lan.crt in /etc/ssl/certs
  • raspberrypi.lan.key in /etc/ssl/private

Stellt auch sicher, dass die Rechte entsprechend gesetzt sind:

sudo chown root:root /etc/ssl/certs/raspberrypi.lan.crt
sudo chmod 777 /etc/ssl/certs/raspberrypi.lan.crt
sudo chown root:ssl-cert /etc/ssl/private/raspberrypi.lan.key
sudo chmod 440 /etc/ssl/private/raspberrypi.lan.key
Terminal / Konsole

Nun noch den Benutzer radicale zur Gruppe ssl-cert hinzufügen:

sudo usermod -a -G ssl-cert radicale
Terminal / Konsole

Abschließend müsst ihr nun noch einmal in der Konfigurationdatei von Radicale im Bereich [server] folgende Anpassung vornehmen:

ssl = True
certificate = /etc/ssl/certs/raspberrypi.lan.crt
key = /etc/ssl/private/raspberrypi.lan.key
Datei: /etc/radicale/config

Radicale-Server starten

Nachdem Radicale nun entsprechend konfiguriert ist, könnt ihr Radicale mit folgendem Befehl starten:

sudo systemctl start radicale.service
Terminal / Konsole

Wenn alles funktioniert, sollte der Radicale-Server auf Port 5232 lauschen:

sudo netstat -ntlp | grep LISTEN
tcp   0   0 192.168.6.238:5232   0.0.0.0:*   LISTEN   1279/python3
Terminal / Konsole
Hinweis Firewall ggf. anpassen

Falls ihr eine Firewall, wie z.B. ufw, verwendet, müsst ihr ggf. noch eine Regel hinzufügen, so dass euer Raspberry Pi eingehende Verbindungen auf Port 5232 erlaubt.

In eurem Heimnetzwerk sollte die Weboberfläche von Radicale über https://raspberrypi.lan:5232 (IP-Adresse geht auch) aufrufbar sein. Aufgrund des eigenen X.509-Zertifikats wird euch euer Webbrowser warnen, dass das Zertifikat nicht vertrauenswürdig ist. In eurem Webbrowser, wie z.B. Firefox, müsst ihr dann euer CA-Root-Zertifikat hinterlegen, so dass das Serverzertifikat von Radicale durch den Webbrowser validiert und als vertrauenswürdig eingestuft werden kann.

Wenn alles funktioniert, könnt ihr den Radicale-Service so einstellen, dass dieser immer direkt beim Systemstart mit gestartet wird:

sudo systemctl enable radicale.service
Terminal / Konsole

Beispiel: Kalenderdaten unter Android synchronisieren

In diesem Beispiel gehe ich kurz darauf ein, wie ihr mit den Apps Etar und DAVx5 eure Kalenderdaten mit eurem Android-Gerät synchronisieren könnt. Falls noch nicht getan, installiert die beiden Apps. Anschließend öffnet DAVx5 und fügt ein neues Konto hinzu und gebt eure Serververbindungsdaten an:

Android - DAVx5: Konto hinzufügen

Da Android bzw. DAVx5 euer Serverzertifikat nicht validieren kann, weil es mit einer unbekannten CA signiert wurde, zeigt euch DAVx5 das Zertifikat an und ihr könnt nach einem Vergleich des Fingerprints dieses als vertrauenswürdig hinzufügen. Alternativ könntet ihr aber auch vor dem Hinzufügen des Kontos euer CA-Root-Zertifikat in Android hinterlegen, dann würde DAVx5 automatisch euer Serverzertifikat validieren und vertrauen.

Android - DAVx5: X.509-Zertifikat bestätigen

Nun könnt ihr bspw. einen neuen Kalender erstellen:

Android - DAVx5: Kalender anlegen

In der App Etar sollten nun eure CalDAV-Kalender aufgelistet sein:

Android - Etar-Einstellungen: Kalender anzeigen

Ihr könnt nun für eure CalDAV-Kalender in Etar Termine hinterlegen und diese werden durch DAVx5 mit eurem Radicale-Server synchronisiert.

Android - Etar: Termin anlegen

Fazit

Mit Radicale könnt ihr eure Kalender-/Kontaktdaten selber hosten und sicher zwischen euren Geräten synchronsieren.