====== letsencrypt ====== letsencrypt bietet die Möglichkeit kostenlos 3-Monate gültige SSL/TLS-Zertifikate zu beziehen. Es existieren mehrere Clients, die unterschiedliche Methoden und Automatisierungsgrade unterstützen. [[https://www.metachris.com/2015/12/comparison-of-10-acme-lets-encrypt-clients/|Comparison of 10 ACME / Let's Encrypt Clients]] **offizieller Client (certbot)**: Die offizielle Client-Software muss direkt auf dem Server gestartet werden (funktioniert also nicht für shared-Hosting sondern nur bei vhosts/root-Servern mit shell-Zugang) und unterstützt. Im standalone-Modus muss der laufende Webserver angehalten werden, es existieren jedoch integrierte Modi für Webserver wie [[apache:Apache]]. Eine [[https://certbot.eff.org/all-instructions|detaillierte Liste für alle verbreiteten Plattformen führt die eff auf]]. ===== Installation ===== :!: Da letsencrypt hat die [[https://community.letsencrypt.org/t/how-to-stop-using-tls-sni-01-with-certbot/83210|Methode TLS-SNI-01 entfernt]], daher ist nun mindestens **certbot --version >= 0.28** nötig. ==== Debian 10 + 11 ==== apt install certbot python3-certbot-apache python3-certbot-nginx Der cronjob liegt in ''/etc/cron.d/certbot''. ==== generische Methode ==== Bei Debian sind in allen älteren stabilen Releases (**vor** Debian 9 / stretch) veraltete Versionen von certbot (bzw. als virtuelles Paket letsencrypt) in den Paketquellen enthalten. Daher ist die generische Methode via git zu verwenden. apt install git git clone https://github.com/letsencrypt/letsencrypt cd letsencrypt ==== Ubuntu / nginx ==== apt-get update apt-get install -y software-properties-common add-apt-repository universe add-apt-repository -y ppa:certbot/certbot apt-get update apt-get install -y python-certbot-nginx ===== Benutzung ===== **letsencrypt aufrufen**: **generisch**: certbot --rsa-key-size 3072 -d DOMAIN.tld -d www.DOMAIN.tld ==== Hooks ==== Die wichtigsten hooks: * pre-hook + post_hooks (Befehle die vorher bzw. nachher laufen) * deploy_hooks (nach erfolgreicher Verlängerung z.B. zur Installation des Zertifikats) Verzeichnisse: /etc/letsencrypt/renewal-hooks/{pre,post,deploy} (z.B. /etc/letsencrypt/renewal-hooks/deploy/allservices.sh) Beispiel: bei standalone-Variante Webserver lighttpd (der keine Integration hat) stoppen ((allerdings wäre hier die Methode webroot sinnvoller)): certbot certonly --pre-hook "systemctl stop lighttpd" --post-hook "systemctl start lighttpd" --rsa-key-size 3072 -d DOMAIN.tld -d www.DOMAIN.tld Es können auch mehrere Befehle (innerhalb eines hooks) angegeben werden: --pre-hook "service apache2 stop ; service postfix stop" https://eff-certbot.readthedocs.io/en/stable/using.html#renewing-certificates ==== Zertifikate verlinken ==== **Zertifikate verlinken:** ln -s /etc/letsencrypt/live/DOMAIN/fullchain.pem letsencryptchain.pem ln -s /etc/letsencrypt/live/DOMAIN/cert.pem /etc/apache2/DOMAIN.crt ln -s /etc/letsencrypt/live/DOMAIN/privkey.pem /etc/apache2/DOMAIN.key **[[apache:ssl|Apache SSL config]]** ===== wildcard-Domains ===== Vorraussetzung ist ein v2 acme-Client ((das ist mittlerweile standard, ansonsten explizit angegeben --server https://acme-v02.api.letsencrypt.org/directory)), direkt per git: aptitude install git git clone https://github.com/letsencrypt/letsencrypt Client holt ein Zertifikat für *.DOMAIN.tld und DOMAIN.tld: ./letsencrypt/letsencrypt-auto certonly -d DOMAIN.tld -d *.DOMAIN.tld --manual --preferred-challenges dns Zur Verifikation müssen **zwei** (!) **[[netzwerke:DNS]] TXT-Records** als _acme-challenge.DOMAIN.tld angelegt werden. Den Inhalt Inhalt legt der Client fest (hier ein Beispiel für "ApKINd5_XvyTvIqFXechXhbH7RebdR01hw5YhTxfQxd") Please deploy a DNS TXT record under the name _acme-challenge.DOMAIN.tld with the following value: ApKINd5_XvyTvIqFXechXhbH7RebdR01hw5YhTxfQxd Before continuing, verify the record is deployed. ------------------------------------------------------------------------------- Press Enter to Continue ===== automatische Verlängerung ===== Die Verlängerung lässt sich auch skripten. Dazu gibt es mehrere Varianten: Der Befehl/das Skript sollte in ''/etc/crontab'' (oder include-Datei / Benutzer-crontab) eingetragen werden. [renewalparams] ... authenticator = standalone post_hook = systemctl start apache2 pre_hook = systemctl stop apache2 ===== Integrationen ===== ==== Apache ==== apt install python3-certbot-apache certbot certonly --apache --deploy-hook "systemctl restart apache2" -d $Domain /etc/letsencrypt/renewal/$Domain.conf # [...] authenticator = apache deploy_hook = systemctl restart apache2 ==== nginx ==== apt install python3-certbot-nginx certbot certonly --nginx --deploy-hook "systemctl restart nginx" -d $Domain /etc/letsencrypt/renewal/$Domain.conf # [...] authenticator = nginx deploy_hook = systemctl restart nginx ==== webroot ==== authenticator = webroot [[webroot_map]] $Domain = /var/www/default/html ==== cronjob ==== 1x pro Woche: 12 4 * * 1 root certbot renew -q Variante mit zufälliger Wartezeit: ''/etc/cron.d/certbot'' 0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew ==== deploy_hooks reparieren (mit ansible) ==== Die Verlängerung der Zertifikate funktioniert aber der Service der sie benutzt wird oft nicht vor Ablauf des Zertifikats neu gestartet? Dafür sind die hooks da, inbesondere der deploy_hook. Falls diese fehlen korrigiert das folgende playbook die deploy_hook (und optional noch die pre_hook or post_hook): [[https://gist.github.com/stefanux/11955353ea4f8002b73e433cbb5dc72e|gist]]: