Last Updated:

FreePBX 17 Zertifikat mit Let's Encrypt via DNS-Challenge erneuern

Ralf Kirchner
Ralf Kirchner Telephony

Nie wieder abgelaufene Zertifikate in FreePBX – mit automatischer DNS-Challenge und sauberer Integration.

In diese Anleitung zeige ich, wie Sie unter FreePBX 17 (Debian) ein Let’s-Encrypt-Zertifikat per DNS-Challenge ausstellen, testen und automatisch in FreePBX, Apache und Asterisk integrieren könnt. Am Beispiel von OVH wird die DNS-Validierung erklärt, die sich aber auch bei anderen Providern nutzen lässt. Ideal für Systeme ohne öffentlich erreichbaren Webserver oder mit restriktiven Firewalls – so erneuern sich Zertifikate zuverlässig und automatisch.

Voraussetzungen

  • FreePBX 17 auf Debian
  • Root-Zugriff auf das System
  • Eine Domain, die über OVH verwaltet wird
  • OVH API-Zugangsdaten (Application Key, Secret, Consumer Key)
  • Internetzugang für das System

Überblick über das Vorgehen

  1. Installation von Snap und Certbot inkl. OVH-DNS-Plugin
  2. Hinterlegen der OVH-API-Zugangsdaten
  3. Test und Ausstellung des Let’s-Encrypt-Zertifikats
  4. Erstellung eines Update-Skripts für FreePBX, Apache und Asterisk
  5. Automatische Einbindung per Certbot-Renew-Hook
  6. Abschließender Funktionstest

1. Installation von Snap und Certbot

Führen Sie alle folgenden Schritte als Root-Benutzer aus.

Snap installieren und vorbereiten

apt install snapd
snap install core; snap refresh core
systemctl enable --now snapd.socket

Certbot und DNS-Plugin installieren

snap install --classic certbot
snap set certbot trust-plugin-with-root=ok
snap install certbot-dns-ovh

Erstellen Sie anschließend einen Symlink, damit Certbot systemweit verfügbar ist:

ln -s /snap/bin/certbot /usr/bin/certbot

2. OVH-API-Zugangsdaten hinterlegen

Certbot benötigt Zugriff auf die OVH-API, um DNS-Einträge für die Challenge automatisch zu setzen.

Verzeichnis und Konfigurationsdatei anlegen

Erstellen Sie als Nächstes eine Datei für die Anmeldeinformationen wie folgt:

mkdir -p /root/.secrets/certbot/
nano /root/.secrets/certbot/ovh.ini

OVH-Zugangsdaten eintragen

# OVH API credentials used by Certbot
dns_ovh_endpoint = ovh-eu
dns_ovh_application_key = XXXXXXXXXXXXXXXX
dns_ovh_application_secret = XXXXXXXXXXXXXXXXXXXXXXXXXXXX
dns_ovh_consumer_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXX

Dateiberechtigungen setzen

chmod 600 /root/.secrets/certbot/ovh.ini

3. DNS-Challenge testen und Zertifikat ausstellen

Funktionstest (Dry-Run)

certbot certonly \
 --dns-ovh \
 --dns-ovh-credentials /root/.secrets/certbot/ovh.ini \
 --dns-ovh-propagation-seconds 60 \
 --dry-run \
 -d example.com

Wenn dieser Test erfolgreich war, kann das Zertifikat produktiv erstellt werden.

Produktives Zertifikat ausstellen

certbot certonly \
  --dns-ovh \
  --dns-ovh-credentials /root/.secrets/certbot/ovh.ini \
  --dns-ovh-propagation-seconds 60 \
  -d example.com

Optional: Staging-Zertifikat für Tests

certbot certonly \
  --dns-ovh \
  --dns-ovh-credentials /root/.secrets/certbot/ovh.ini \
  --dns-ovh-propagation-seconds 60 \
  --staging \
  -d example.com

4. Zertifikats-Update-Skript für FreePBX erstellen

Damit das Zertifikat nach jeder Erneuerung automatisch in FreePBX, Apache und Asterisk übernommen wird, erstellen wir ein eigenes Skript.

Skript anlegen

mkdir -p /root/bin && nano /root/bin/freepbx-cert-update.sh

Skriptinhalt

Hinweis: Ersetzen Sie pbx.demo.de durch Ihre eigene Domain.

#!/bin/bash
# ---------------------------------------------------------------------------
#  FreePBX 17.x + Asterisk + Apache (pki) Zertifikats-Rollout Script
#  Integration mit certbot (DNS Challenge)
# ---------------------------------------------------------------------------

DOMAIN="pbx.demo.de"
LE_PATH="/etc/letsencrypt/live/$DOMAIN"
FPBX_KEY_DIR="/etc/asterisk/keys"
APACHE_PKI_DIR="/etc/apache2/pki"
FPBX_CERT_NAME="letsencrypt-$DOMAIN"

LOGFILE="/var/log/freepbx-cert-update.log"
#exec > >(tee -a "$LOGFILE") 2>&1
exec >> "$LOGFILE" 2>&1
echo "=============================="
echo "[INFO] Starte Zertifikatsupdate für $DOMAIN"
echo "Datum: $(date)"
echo "=============================="

# Check Certbot output
if [ ! -f "$LE_PATH/fullchain.pem" ] || [ ! -f "$LE_PATH/privkey.pem" ]; then
  echo "[ERROR] Zertifikatsdateien fehlen im $LE_PATH"
  exit 1
fi

# Backup
mkdir -p "$FPBX_KEY_DIR/backup" "$APACHE_PKI_DIR/backup"
cp -a "$FPBX_KEY_DIR"/*.pem "$FPBX_KEY_DIR/backup/" 2>/dev/null
cp -a "$APACHE_PKI_DIR"/*.crt "$APACHE_PKI_DIR"/*.key "$APACHE_PKI_DIR/backup/" 2>/dev/null
echo "[INFO] Backup abgeschlossen."

# Zertifikate für Asterisk
cp "$LE_PATH/fullchain.pem" "$FPBX_KEY_DIR/$FPBX_CERT_NAME.crt"
cp "$LE_PATH/privkey.pem" "$FPBX_KEY_DIR/$FPBX_CERT_NAME.key"
chown asterisk:asterisk $FPBX_KEY_DIR/$FPBX_CERT_NAME.*
chmod 600 $FPBX_KEY_DIR/$FPBX_CERT_NAME.*
echo "[INFO] Zertifikate für Asterisk kopiert."

# Zertifikate für Apache (FreePBX WebGUI)
cp "$LE_PATH/fullchain.pem" "$APACHE_PKI_DIR/webserver.crt"
cp "$LE_PATH/privkey.pem" "$APACHE_PKI_DIR/webserver.key"
# optional: Chain-Datei (falls vorhanden)
if [ -f "$LE_PATH/chain.pem" ]; then
  cp "$LE_PATH/chain.pem" "$APACHE_PKI_DIR/webserver-ca-bundle.crt"
fi
chmod 640 $APACHE_PKI_DIR/webserver.*
chown root:root $APACHE_PKI_DIR/webserver.*

echo "[INFO] Apache-PKI-Zertifikate aktualisiert."

# Import in FreePBX und als Default setzen
fwconsole cert --import --force
fwconsole cert --default="$FPBX_CERT_NAME"
fwconsole sa ihc default
fwconsole reload
echo "[INFO] Zertifikat in FreePBX gesetzt."

# Apache & Asterisk reloaden
systemctl reload apache2 2>/dev/null || systemctl restart httpd
fwconsole restart

echo "[OK] Zertifikat erfolgreich aktualisiert & Dienste neu geladen."
exit 0

Skript ausführbar machen

chmod 750 /root/bin/freepbx-cert-update.sh

5. Automatische Erneuerung per Certbot-Hook

Öffnen Sie die Erneuerungskonfiguration Ihrer Domain:

nano /etc/letsencrypt/renewal/<YOUR_DOMAIN_NAME>.conf

Ergänzen Sie im Abschnitt [renewalparams] folgenden Eintrag:

renew_hook = sh /root/bin/freepbx-cert-update.sh

6. Erneuerung testen

certbot renew --dry-run

Bei erfolgreichem Test erhalten Sie eine Ausgabe ähnlich dieser:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/<YOUR_DOMAIN_NAME>.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Simulating renewal of an existing certificate for <YOUR_DOMAIN_NAME>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/<YOUR_DOMAIN_NAME>/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Führen Sie abschließend das Skript für den Zertifikatsaustausch einmal manuell aus:

sh /root/bin/freepbx-cert-update.sh

Abschluss

Damit ist die automatische Erneuerung und Integration von Let’s-Encrypt-Zertifikaten per DNS-Challenge in FreePBX 17 vollständig eingerichtet. Ihre FreePBX-Installation bleibt damit dauerhaft abgesichert – ganz ohne manuelle Zertifikatswechsel.

Quellen