Automatische Wildcard SSL Certificates mit LetsEncrypt für HaProxy

30 Sep 2021

Mit Wildcard SSL Zertifikaten kann man nicht nur seine Domain sonder auch alle Subdomains absichern, welche von einem Server oder Proxy ausgeliefert werde.
Da ich gute Erfahrungen mit dem Domain Provicer MyOnlinePortal.net habe, wird dieser hier in den Beispielen verwendet.

Installation

sudo python3 -m pip install --upgrade certbot
sudo python3 -m pip install certbot-dns-myonlineportal

Konfiguration

Erstelle eine Passwortdatei mit den Benutzernamen und Password vom DynDNS provider. Zum Beispiel /etc/letsencrypt/.myonlineportal-credentials.ini:

dns_myonlineportal_username = username
dns_myonlineportal_password = password
dns_myonlineportal_endpoint = https://myonlineportal.net/set-acme

Aus Sicherheitsgründen sollte nur der Besitzer Zugriff haben

sudo chmod 600 /etc/letsencrypt/.myonlineportal-credentials.ini

Benutzung

Initial Erstellen
sudo certbot certonly --no-self-upgrade --agree-tos \
--authenticator dns-myonlineportal \
--dns-myonlineportal-propagation-seconds 120  \
--dns-myonlineportal-credentials /etc/letsencrypt/.myonlineportal-credentials.ini  \
--email 'me@example.com' \
-d example.myonlineportal.net -d *.example.myonlineportal.net

Achte auf den -d Parameter, es sind zwei vorhanden, einer explizit für die Wildcard Domain. Das funktioniert natürlich auch ohne Wildcard Domain. Ändere auch den --email Parameter auf Deine E-Mail Adresse.

Nach der Ausführung solltest Du folgendes sehen

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugin legacy name certbot-dns-myonlineportal:dns-myonlineportal may be removed in a future version. Please use dns-myonlineportal instead.
Requesting a certificate for example.myonlineportal.net and *.example.myonlineportal.net
Waiting 90 seconds for DNS changes to propagate

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.myonlineportal.net/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/example.myonlineportal.net/privkey.pem
This certificate expires on 2021-12-29.
These files will be updated when the certificate renews.

NEXT STEPS:
- The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Das Zertifikate für den HaProxy Erreichbar und Benutzbar machen. Wenn Deine /etc/haproxy/haproxy.conf das Zertifikat wie folgt konfiguriert hat

frontend www-https
    bind *:443 ssl crt /etc/ssl/example.myonlineportal.net.pem

musst du die fullchain.pem und privkey.pem Datei zusammen in eine Datei mit dem Namen /etc/ssl/example.myonlineportal.net.pem packen

cat /etc/letsencrypt/live/example.myonlineportal.net/fullchain.pem > /etc/ssl/example.myonlineportal.net.pem
cat /etc/letsencrypt/live/example.myonlineportal.net/privkey.pem >> /etc/ssl/example.myonlineportal.net.pem

und den HaProxy reloaden

systemctl reload haproxy.service

oder restarten

systemctl restart haproxy.service
Renew

Um das Zertifikat zu erneuern benutze renew

sudo certbot renew --no-self-upgrade --agree-tos \
--authenticator dns-myonlineportal \
--dns-myonlineportal-propagation-seconds 120  \
--dns-myonlineportal-credentials /etc/letsencrypt/.myonlineportal-credentials.ini  \
--email 'me@example.com'

und die fullchain.pem und privkey.pem Datei zusammen in eine Datei mit dem Namen /etc/ssl/example.myonlineportal.net.pem packen

cat /etc/letsencrypt/live/example.myonlineportal.net/fullchain.pem > /etc/ssl/example.myonlineportal.net.pem
cat /etc/letsencrypt/live/example.myonlineportal.net/privkey.pem >> /etc/ssl/example.myonlineportal.net.pem

und den HaProxy reloaden

systemctl reload haproxy.service

oder restarten

systemctl restart haproxy.service
Edit 11/2/2024

Veraltete Optionen entfernt und noch mal getestet