Let’s Encrypt Zertifikate für ejabberd

Eine sichere Kommunikation ist heute unverzichtbar und sollte obligatorisch sein. Let’s Encrypt hat den Prozess zur Erstellung gültiger und allgemein vertrauenswürdiger Zertifikate revolutioniert. Wie man mit Let’s Encrypt Zertifikte für ejabberd‑Dienste erstellt, beschreibe ich in diesem Blogeintrag.

Verwendete Software

  • Certbot 0.22
  • ejabberd Community Server 18.01

Voraussetzungen

Für die Zertifikaterstellung verwende ich Certbot. Dies ist der empfohlene Client um Zertifikate bei Let’s Encrypt zu erstellen und abzurufen. Im Rahmen dieses Tutorials setze ich Grundkenntnisse im Umgang mit Certbot voraus.

Seit Version 17.11 beherrscht ejabberd ebenfalls das ACME‑Protokoll zur direkten Interaktion mit Let’s Encrypt. Ich habe mich dennoch für den Einsatz von Certbot entschieden. Denn auf dem Server werden auch andere Dienste mit Let’s Encrypt Zertifikaten durch Certbot versorgt. Die Prozesse sollen einheitlich bleiben.

Zertifikat erstellen / erneuern

Certbot führt zu jeder Zertifikatserstellung bzw. -erneuerung eine Validierung aller Domains durch, für die das Zertifikat ausgestellt werden soll.

Initiale Erstellung

Da bei ejabberd mehrere Domänennamen für ein Zertifikat validiert werden müssen, verwende ich die Webroot‑Challange (auch HTTP‑01 Challenge). Für diese Validierung plaziert Certbot temporär einige Dateien im angebenen Webroot‑Verzeichnis, welche wiederum unter den gewählten Domänennamen abrufbar sein müssen.

Nachdem ein Apache vHost eingerichtet wurde, welcher die Domänennamen akzeptiert, kann das Zertifikat initial mit Certbot erstellt werden.

certbot certonly --webroot -w /var/www/xmpp -d xmpp.example.com -d conference.example.com -d pubsub.example.com -d example.com

Die Challanges lassen sich, wenn nötig auch auf verschiedene Webroot‑Verzeichnisse aufteilen.

CommonName des Zertifikats wird der erste angegebene Domänenname, die übrigen Namen werden als Subject Alternative Name (SAN) eingetragen.

Erneurungen

Nachfolgende (automatisierte) Erneurungen von Zertfikaten werden wie gewohnt durchgeführt.

certbot renew

Zertifikat für ejabberd bereitstellen

Certbot speichert die Zertfikatsdateien standardmäßig unter /etc/letsencyrpt/live/xmpp.example.com. Doch der ejabberd Dienst besitzt keine Leseberechtigungen für dieses Verzeichnis. Die Dateien müssen daher für Ihren Einsatz an einen anderen Ort kopiert werden.

Deploy Hook

Zur jeder Erneuerung eines Zertifikats kann Certbot verschiedene Hooks ausführen. Mit einem solchen lässt sich der Kopiervorgang in den Automatismus integrieren. Dazu wird ein bash‑Skript als Deploy Hook in /etc/letsencyrpt/live/renewal-hooks/deploy erstellt.

#!/bin/sh

set -e

for domain in $RENEWED_DOMAINS; do
  case $domain in
  xmpp.example.com)
    daemon_user=ejabberd
    daemon_cert_root=/opt/ejabberd/conf/cert

    # Make sure the certificate and private key files are
    # never world readable, even just for an instant while
    # we're copying them into daemon_cert_root.
    umask 077

    cp "$RENEWED_LINEAGE/fullchain.pem" "$daemon_cert_root"
    cp "$RENEWED_LINEAGE/privkey.pem" "$daemon_cert_root"

    # Apply the proper file ownership and permissions for
    # the daemon to read its certificate and key.
    chown $daemon_user $daemon_cert_root/*.pem
    chmod 400 $daemon_cert_root/privkey.pem

    service ejabberd restart > /dev/null
    ;;
  esac
done

# source: certbot docs

Alle Skripte in diesem Verzeichnis werden zu jeder erfolgten Zertifikatserneuerung ausgeführt. Wurde ein neues Zertifikat für xmpp.example.com ausgestellt, wird dieses (und der private Schlüssel) an den Zielort kopiert, wo es von ejabberd gelesen werden kann.  Zuletzt wird der Dienst neu gestartet.

Hinweis: Das Skript muss das exec‑Attribut besitzen chmod +x script.sh.

ejabberd Konfigurieren

Die Zertifikate sollten sicher abgelegt werden, sodass nur berechtigte Systemnutzer Zugriff auf die Zertifikatsdaten besitzen. Dazu wurde ein neues Unterverzeichnis erzeugt und die Berechtigung entsprechend gesetzt. Certbot legt hier die die Zertifikate ab.

cd /opt/ejabberd/conf

# create subdir to store certs
mkdir cert

# restrict access to ejabberd sysuser only
chown ejabberd:ejabberd cert
chmod 700 cert

Abschließend muss noch die Konfiguration in ejabberd.yml angepasst werden.

...
certfiles:
  - "/opt/ejabberd/conf/cert/fullchain.pem"
  - "/opt/ejabberd/conf/cert/privkey.pem"