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.
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
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
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
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
Öffnet wieder die Konfigurationsdatei und aktiviert die Benutzer-Authentifizierung im Bereich [auth]
:
type = htpasswd
htpasswd_filename = /etc/radicale/users
htpasswd_encryption = bcrypt
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
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
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
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
[...]
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
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
Nun noch den Benutzer radicale
zur Gruppe ssl-cert
hinzufügen:
sudo usermod -a -G ssl-cert radicale
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
Radicale-Server starten
Nachdem Radicale nun entsprechend konfiguriert ist, könnt ihr Radicale mit folgendem Befehl starten:
sudo systemctl start radicale.service
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
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
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:

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.

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

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

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

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