Let’s encrypt Zertifikat über DNS challenge installieren

In diesem Beitrag stelle ich eine Vorgehensweise vor, um auf einem apache2 oder nginx server ein let’s encrypt zertifikat zu installieren.

Dabei werde ich für die Authorisierungs den Challenge Type DNS verwenden.

Anforderungen

mindestens Ubuntu >= 18.04.5 LTS oder gleichwertig
certbot über apt/snap installieren (https://certbot.eff.org/instructions)
dig kann über apt installiert werden ‚apt install dnsutils

DNS Challenge command aufrufen

certbot certonly --manual --preferred-challenges dns --debug-challenges -d *.your-domain -d your-domain

Wenn certbot richtig installiert wurde sollte der Befehl ungefähr diese Ausgabe erzeugen.

Die folgende Frage mit ‚y‘ bestätigen.

DNS Challenge TXT Record erstellen

Danach bekommt man einen DNS TXT record angezeigt.
Wichtig hier erst auf Enter drücken, wenn man den Eintrag über tools wie dig findet.

Als nächsten Schritt muss der TXT Record in einem DNS Service eurer Wahl hinterlegt werden.
Der TXT Record Name enspricht dem Format ‚_acne-challenge.your-domain‘.
Value ist ein langer Hashwert.

Mit ‚dig‘ prüfen ob der TXT Record live ist

Ab dann muss unbedingt mit ‚dig‘ geprüft werden, ob der DNS Record live ist oder noch gewartet werden muss, da die challenge Validierung von certbot sonst fehlschlagen wird!
Die rot markierte Zahl ist die TTL Zeit in Sekunden für die einen Record als DNS Eintrag bestehen bleibt.
Wenn der Eintrag noch einen alten Wert enthält muss man diese Zeit abwarten.

Zertifikat speichern

Wenn der neue DNS Record mit dem richtigen Name/Value Paar gefunden wird, kann der nächste Schritt in certbot gemacht werden.

Sollte man zu früh den nächsten Schritt in certbot machen bekommt man eine Fehlerausgabe wie diese hier.

VHost konfiguration anlegen

Danach muss man für den Webserver einen VHost anlegen, der das Zertifikat verwendet.

Apache2


Bei Apache werden diese für gewöhnlich in einer VHost konfiguration in /etc/apache2/sites-enabled/default.conf angelegt und haben folgenden Inhalt. (Andere Beispiel konfigurationen hier)

<IfModule mod_ssl.c>
<VirtualHost *:443>

ServerName www.your-domain
ServerAlias your-domain
DocumentRoot /var/www/your-domain

<Directory /var/www/your-domain>
 Options +FollowSymlinks
 AllowOverride All
</Directory>
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined


Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/your-domain/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/your-domain/privkey.pem
</VirtualHost>
</IfModule>

Nginx

Bei Nginx sollte die config in /etc/nginx/sites-enabled/default stehen und folgenden Inhalt haben.

server {
       listen 80 default_server;
       listen [::]:80 default_server;

       # SSL configuration
       #
       listen 443 ssl;
       listen [::]:443 ssl;  
       #
       # Note: You should disable gzip for SSL traffic.
       # See: https://bugs.debian.org/773332
       #
       # Read up on ssl_ciphers to ensure a secure configuration.
       # See: https://bugs.debian.org/765782
       #
       # Self signed certs generated by the ssl-cert package
       # Don't use them in a production server!
       #
       # include snippets/snakeoil.conf;
       ssl_certificate /etc/letsencrypt/live/your-domain/cert.pem;
       ssl_certificate_key /etc/letsencrypt/live/your-domain/privkey.pem;

       root /var/www/html;

       # Add index.php to the list if you are using PHP
       index index.html index.htm index.nginx-debian.html;

       server_name your-domain;

       location / {
               # First attempt to serve request as file, then
               # as directory, then fall back to displaying a 404.
               try_files $uri $uri/ index.html =404;
       }

       # pass PHP scripts to FastCGI server
       #
       #location ~ \.php$ {
       #       include snippets/fastcgi-php.conf;
       #
       #       # With php-fpm (or other unix sockets):
       #       fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
       #       # With php-cgi (or other tcp sockets):
       #       fastcgi_pass 127.0.0.1:9000;
       #}

       # deny access to .htaccess files, if Apache's document root
       # concurs with nginx's one
       #
       #location ~ /\.ht {
       #       deny all;
       #}
}