Raspberry Pi: XMPP-Server Prosody installieren
Messenger gibt es inzwischen unglaublich viele. Die meisten haben gemeinsam, dass sie über einen von dem Hersteller bereitgestellten und kontrollierten Server die Nachrichten austauschen und diese dort so gespeichert sind, dass der Betreiber bei Bedarf in diese Einsicht hat. Dieses Verhalten ist nicht immer gewünscht. XMPP (Extensible Messaging and Presence Protocol, englisch für erweiterbares Nachrichten- und Anwesenheitsprotokoll; früher Jabber) ist ein offener Standard eines Kommunikationsprotokolles, das sich als Messenger benutzen lässt. Ein XMPP-Server ist dabei ein Server der selbst betrieben werden kann und über den die Kommunikation läuft. Er kann mit anderen XMPP-Servern kommunizieren – muss jedoch nicht unbedingt. Außerdem gibt es mit OTR (Off-the-Record Messaging) einen Standard zur clientseitigen Verschlüsselung der Nachrichten. Prosody (früher lxmppd) ist eine schlanke und plattformunabhängige XMPP-Server Anwendung, die auch auf dem Raspberry Pi läuft. Wie man einen Prosody XMPP-Server auf dem Raspberry Pi installiert und verwendet werde ich im folgenden Artikel erklären.
Voraussetzung: Raspbian oder vergleichbare Distribution installiert
XMPP Clients für alle erdenklichen Arten von Geräten finden sich in einer Liste der XMPP Standards Foundation. Die dort gelisteten Clients sind zwar nicht mehr alle aktuell, jedoch sollte bei deren Vielzahl dort jeder für seine Geräte fündig werden .
Zunächst müssen wir den Paketlisten des Paketmangers APT das Prosody Repository und dessen Keyfile hinzufügen wie auch die Paketlisten aktualisieren, damit wir Prosody installieren können. Zuvor installieren wir noch die Anwendung lsb_release, damit automatisch die Paketliste für die richtige Version des Betriebssystems verwendet wird.
sudo apt-get install -y lsb-release
echo deb http://packages.prosody.im/debian $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list
wget https://prosody.im/files/prosody-debian-packages.key -O- | sudo apt-key add -
sudo apt-get update
Nun können wir schon Prosody über den Paketmanager installieren. Dies bietet, im Gegensatz zu einer händischen Installation, den Vorteil, dass wir später mittels sudo apt-get upgrade
den XMPP-Server auf dem Raspberry Pi ganz einfach updaten können.
sudo apt-get install prosody
Damit wir den XMPP-Server später auch außerhalb des eigenen Netzwerkes erreichen können, sollten wir eine DynDNS Domain einrichten. Wie dies zu bewerkstelligen ist erklärte ich bereits in dem Artikel DynDNS einrichten. Im Beispiel verwende ich die DynDNS Domain jankarres.no-ip.org.
Die Anwendung ist installiert und die DynDNS Domain eingerichtet. Außerdem wurde bereits während der Installation ein SSL-Zertifikat für localhost erstellt. Für die DynDNS Domain müssen wir jedoch noch einmal ein separates SSL-Zertifikat erzeugen.
Bei den Fragen in der Eingabeaufforderung, die beim vorletzten Befehl auftreten, geben wir lediglich bei Country Name den Wert DE für Deutschland und bei Common Name die DynDNS Domain deines Raspberry Pis an. Allen weiteren Fragen können wir mittels Enter den Standardwert zuweisen.
sudo su
cd /etc/prosody/certs/
sudo openssl genrsa -out prosody.key 4096
sudo openssl req -new -sha256 -key prosody.key -out prosody.csr
sudo openssl x509 -req -sha256 -days 3650 -in prosody.csr -signkey prosody.key -out prosody.crt
exit
Nachdem alle nötigen Schritte der eigentlichen Installation absolviert sind, können wir die Konfiguration des XMPP-Servers Prosody anpassen. Dabei müssen wir mehrere Abschnitte bearbeiten. In dem Editor nano kann man mittels STRG + W suchen und mittels STRG + X, Y und Enter speichern.
sudo nano /etc/prosody/prosody.cfg.lua
Als erstes setzen wir in die Admin-Liste die E-Mail Adresse, die der Account des Admins später haben wird. Die XMPP E-Mail Adressen müssen mit der DynDNS Domain enden (in meinem Fall @jankarres.no-ip.org).
admins = { }
ersetzen durch z.B.
admins = { "[email protected]" }
Falls sich jeder öffentlich einen Account bei dem XMPP-Server anlegen können soll, muss folgende Zeile abgeändert werden.
allow_registration = false;
ersetzen durch
allow_registration = true;
Außerdem müssen wir die in den vorherigen Schritten definierte DynDNS Domain und SSL-Zertifikate aktivieren.
VirtualHost "example.com" enabled = false -- Remove this line to enable this host -- Assign this host a certificate for TLS, otherwise it would use the one -- set in the global section (if any). -- Note that old-style SSL on port 5223 only supports one certificate, and will always -- use the global one. ssl = { key = "/etc/prosody/certs/example.com.key"; certificate = "/etc/prosody/certs/example.com.crt"; }
ersetzen durch z.B. (DynDNS Domain, im Beispiel jankarres.de, ersetzen)
VirtualHost "jankarres.no-ip.org" ssl = { key = "/etc/prosody/certs/prosody.key"; certificate = "/etc/prosody/certs/prosody.crt"; }
Damit die geänderten Prosody Einstellungen ihre Wirkung entfalten, müssen wir die Anwendung neustarten.
sudo /etc/init.d/prosody restart
Es ist an der Zeit Benutzer anzulegen. Dies ist über folgendes Kommando beliebig oft möglich, wobei die XMPP E-Mail Adresse (Leerzeichen anstatt @) und das Passwort angepasst werden muss. Die XMPP E-Mail Adressen, wie oben beschreiben, müssen mit der DynDNS Domain enden (in meinem Fall @jankarres.no-ip.org). Bei der E-Mail ist zu beachten, dass insbesondere der oben definierte Admin-Account angelegt werden sollte!
sudo prosodyctl register webmaster jankarres.no-ip.org super-secret1Password
Damit ist die Einrichtung des XMPP-Servers Prosody abgeschlossen. Nachdem die Ports (siehe unten) freigegeben sind kann man sich auf dem verwendeten Client mit der E-Mail Adresse und dem verwendeten Passwort anmelden und der Chat kann beginnen. Falls gewünscht muss die clientseitige Verschlüsselung der Nachrichten OTR (Off-the-Record Messaging) im verwendeten Client eingerichtet werden, wobei dies nicht Bestandteil des Tutorials sein soll, da es nur um den XMPP-Server Prosody auf dem Raspberry Pi gehen soll.
Zugriff außerhalb des eigenen Netzwerks
Portfreigabe im Router
Soll der soeben installierte Dienst auch außerhalb des eigenen Netzwerkes verfügbar sein, so müssen folgende Ports im Router freigegeben werden. Wie man freigibt, beschrieb ich in dem Artikel Portforwarding bei Fritz!Box und Speedport.
31 Kommentare. Hinterlasse eine Antwort
Moin!
Guter Beitrag der das wesentliche Erklärt. Ich hab vor einem Jahr mit XMPP auf dem RPi rumprobiert. Leider funktionierte das schreiben von Nachrichten mit einem Account auf verschiedenen Geräten nicht richtig. Wie sieht das jetzt aus vezüglich Smartphone Nutzung?
Auf dem Smartphone kommt das immer auf den verwendeten Client an. Diesbezüglich müsstest du folglich selbst schauen, wie dieser das löst. In der Regel funktioniert es jedoch auch auf Smartphones einwandfrei.
Hallo Jan,
nur als kleine Anregung, vielleicht hast du eh schon dran gedacht: Sobald Let’s Encrypt (https://letsencrypt.org) fertig ist, könntest du das selbst-signierte TLS-Zertifikat durch ein solches ersetzen bzw. als Alternative anbieten, wenn das möglich ist.
Wobei ich mich da frage, ob das mit DynDNS (no-ip.org) funktionieren wird.
Vor allem bei der kostenlosen Subdomain habe ich da Zweifel.
Also mit LE funktionieren auch DynDNS Adressen. Anleitung zum einbinden: http://trikks.de/2017/11/14/xmpp-server-auf-raspberry-pi3/
Wenn das Projekt online ist könnte man durchaus überlegen ob man dieses stattdessen empfiehlt. Wobei ich glaube, dass Findus23 den Knackpunkt angesprochen hat. Mal sehen 😉
Hallo zusammen,
bekomme immer folgende Fehlermeldung: E: Typ »wget« in Zeile 2 der Quellliste /etc/apt/sources.list ist unbekannt .
Ich hoffe man kann mir helfen es gibt ja auch noch andere nette Leute die dich bzw. den Blog hier unterstützen.
Pidder123
Du hast, wieso auch immer, in der Datei /etc/apt/sources.list in Zeile 2 ein wget, dass dort nicht rein gehört. Kannst du mit z.B. mit dem Editor nano bearbeiten.
Ich würde für prosody und apt eine eigene Sources-List erstellen. Das erhöht die Übersichtlichkeit bei vielen Quellen: „echo deb … | sudo tee /etc/apt/sources.list.d/prosody.list“.
Ich denke das ist eine Frage des Stiles – funktioniert ja beides 😉
Seltsamerweise gibt es das Prosody Repository unter jessie nicht für armhf
(Vergleiche http://packages.prosody.im/debian/dists/jessie/InRelease mit http://packages.prosody.im/debian/dists/wheezy/InRelease )
Aber die Version in den Debian-Paketquellen ist nicht so stark veraltert (0.9.7-2 im Vergleich zu 0.9.8-1~wheezy2)
Daher empfehle ich allen mit Debian jessie einfach den Schritt 1 zu überspringen.
In dem Zusammenhang ist vielleicht der Kommentar eines Enwicklers zu der Geschichte interessant:
https://prosody.im/issues/issue/522
openssl x509 -req -sha256 -days 3650 -in prosody.csr -signkey prosody.key -out prosody.crt
erzeugt einen Fehler
„unknown option x509“
Welcher Parameter ist falsch ?
Bei mir funktioniert der Befehl sowohl unter wheezy als auch unter Jessie. Verwendest du Raspbian? Welche Version von OpenSSL ist installiert (Befehl: „openssl version“)?
Ich habe Jessie benutzt, aber auf einem Cubietruck
Kann ich leider nicht mehr testen weil ich die SD zwischenzeitlich schon für was anderes brauche (Odroid XU4)
Werde es am Wochenende aber mal neu mit Raspbian versuchen
Hat es bei Dir mir Raspbian geklappt ?
Ja, unter Jessie (Pi2) läuft es ohne Probleme. Unter wheezy habe ich nur schnell die drei openssl-Befehle getestet.
Gibt es keine Lösung ?
Würde Prosody gerne verwenden
Es hat nun geklappt
Obwohl der Restart des Servers mit der abgeänderten prosody.cfg.lua nicht funktionierte
Habe eine funktionierende im Netz gefunden
Hi,
ich bekomme diesen Fehler :Sep 28 19:12:27 c2s6b1e90 info Client disconnected: connection closed
Sep 28 19:13:58 c2s777f10 info Client connected
Sep 28 19:13:58 c2s777f10 info c2s stream for closed: This server does not serve DOMAIN
IP und DOMAIN habe ich zum Schutz weg gemacht, ist aber wie im oben konfiguriert
was ist die Fehler?
Bei mir kam diese Meldung, weil ich vergessen hatte, diese zwei Zeilen auszukommentieren:
— VirtualHost „localhost“
[…]
— enabled = false — Remove this line to enable this host
Hallo, Prosody lässt sich dank der guten Aleitung wirklich sehr einfach einrichten 🙂 Über dieses Tutorial hinaus stehe ich allerdings jetzt vor einem Problem, welches ich nicht gelöst bekomme. Ich möchte gerne in Prosody den Transport Gateway zu icq einrichten, bekomme aber das dazu benötigte Spectrum2 auf meinem RPi2 wheezy nicht installiert. Gibt es dazu eine Anleitung, bzw. was ist bei der Installation zu beachten?
Hallo, was auch ein Artikel wert wäre http_upload https://prosody.im/doc/http so einfach ist das ganze nicht eingerichtet…aber gerade mit Conversations sehr Interresant.
Gibt es auch eine Möglichkeit anstelle von Step 4 ein Zertifikat von Let’s Encrypt zu benutzen?
Habe alles so installiert, wie es in dem Tutorial erklärt wird.
Wie kann ich jetzt ein SSL-Zertifikat mit einem User verbinden, sodass sich nur User einloggen können die das „Gegen“-Zertifikat haben oder habe ich da was falsch verstanden?
Hallo, sehr gut beschriebenes Tutorial, jedoch scheint in der aktuellen Version von Rasperian Jessie zusammen mit der geladenen Prosodyversion ein Fehler produziert.
Auch ein tauschen (laut anderer Blogs) der config bringt immer den gleichen Fehler.
Kannst du das Tutorial noch einmal mit der aktuellen Version testen?
Error: /etc/prosody/prosody.cfg.lua:23: ‚}‘ expected near ‚@‘
kommt jedes mal als Fehler – kannst Du mir helfen?
Auch ich scheitere an diesem Fehler. Hast Du dafür schon eine Lösung finden können?
Das bedeutet, dass in der Zeile 23 in /etc/prosody/prosody.cfg.lua ein Syntaxfehler ist. Da es sich lt. obiger Anleitung um die Zeile mit der Admin-E-Mail-Adresse handelt, nehme ich an, dass diese nicht korrekt in Hochkommas gesetzt wurde. Wenn nicht, was steht denn in dieser Zeile?
Bei mir ist die Zeile exakt formatiert wie bei Jan: admins = { „[email protected]“ }
Trotzdem habe ich leider kein Glück.
Wurden die hochkommas vielleicht kopiert? Ist ein typisches Problem. Bitte mal selbst setzen.
Gruß
Wirklich tolle Tutorials. Ich habe ein Problem: beim verbinden mit meinem Pi bekomme ich jedesmal „Stream Error“. Ich habe alles mehrmals nach der Anleitung gemacht. Könnten Sie mir da vielleicht weiterhelfen?