Ein kostenloses Zertifikat für den Webserver mit der Zertifizierungsstelle Let’s Encrypt erstellen

Die Erstellung von Zertifikaten mit Let’s Encrypt  beginnt mit der Installation von certbot.  Die ist einfach, wir geben

sudo apt-get install certbot

in einem Terminalfenster ein.

Die Zertifizierung stellt zwei Herausforderungen:
  1. Es muss ein bestimmter Text-Eintrag im DNS der Domain vorhanden sein
  2. Auf dem Server, der unter diesem Domainnamen erreichbar ist, muss in einem bestimmten Verzeichnis eine Datei mit einem bestimmten Dateinamen und Inhalt liegen.

Für die zweite Herausforderung konfigurieren wir einen einfachen Express Server in einem beliebigen Unterverzeichnis (im Beispiel express) der virtuellen Maschine. Mit der Eingabe folgender Kommandos

npm init -y
npm install express

erzeugen wir in diesem Verzeichnis eine package.json-Datei und installieren anschließend express.

Das Aufwändigste an dem Server ist seine Konfigurationsdatei server.js, die im Basisverzeichnis liegt und folgendes Aussehen hat:

const express = require('express');
const app = express();

app.use("/.well-known", express.static(".well-known"));
app.get('*', (req, res) => {
  res.sendStatus(200)
});
app.listen(80, () => {
  console.log('HTTP server running on port 80');
});

// starten mit sudo node server.js
server.js

Ein Verzeichnis mit dem ungewöhnlichen Namen .well-known wird für certbot benötigt. Wir legen deshalb dieses Verzeichnis auch im Dateibaum des Servers an. Zu Testzwecken können wir in diesem Verzeichnis eine beliebige html-Datei unterbringen. Das Verzeichnis sieht dann so aus:

Express-Server
Express-Server

Nach dem Starten des Express-Servers (sudo node server.js) sollte die HTML-Datei unter http://domainname/.well-known/index.html erreichbar sein. Dies ist Voraussetzung für die Zertifizierung.

Das Terminal-Kommando für eine Testzertifizierung ist:

sudo certbot certonly --manual -d *.<meineDomain.xyz>,<meineDonaim.xyz>  --test-cert

Beim allerersten Mal ist das Vorgehen etwas knifflig, daher die Testzertifizierung.

Der Ablauf am Bildschirm ist der folgende:

anton_beton@web-node-server:~$ sudo certbot certonly --manual -d *.nodeweb.tk,nodeweb.tk --test-cert
"Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Cert not yet due for renewal
You have an existing certificate that has exactly the same domains or certificate name
 you requested and isn''t close to expiry.
(ref: /etc/letsencrypt/renewal/nodeweb.tk.conf)
What would you like to do?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Keep the existing certificate for now
2: Renew & replace the cert (limit ~5 per 7 days)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Renewing an existing certificate
Performing the following challenges:
dns-01 challenge for nodeweb.tk
http-01 challenge for nodeweb.tk
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.
Are you OK with your IP being logged?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  Please deploy a DNS TXT record under the name
_acme-challenge.nodeweb.tk with the following value:
Le7uDyZlW3OZv1zklFSBlfCcurvzvCibon_oOimW8dM
Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"

An dieser Stelle die erste Herausforderung: Es soll im DNS ein TEXT-Resource-Record mit bestimmtem Inhalt für die Subdomain _acme-challenge vorhanden sein. Im DNS Management sieht das so aus:

Zertifikat DNS-challenge
Zertifikat DNS-challenge

Die ergänzten DNS-Einträge sind nicht sofort wirksam. Ein zu frühes Drücken auf ⏎ bricht die Zertifizierung ab. Den DNS-Status kann man z.B. hier abfragen. Wird hier der gewünschte TXT-Eintrag angezeigt, kann man getrost auf ⏎ drücken. Es geht weiter mit der zweiten Herausforderung:

"Create a file containing just this data:
V4wH9uEGJAvmCcGQJOLypYr8kMuVCEl1S05iqzyvv2M.xCd_mSgGAVbCIfp5Ol-Wd0omTFH-95f6HeVCmrdeHD8
And make it available on your web server at this URL:
http://nodeweb.tk/.well-known/acme-challenge/V4wH9uEGJAvmCcGQJOLypYr8kMuVCEl1S05iqzyvv2M
(This must be set up in addition to the previous challenges; do not remove,
replace, or undo the previous challenge tasks yet.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue "

Im Verzeichnis /.well-known soll das Unterverzeichnis acme-challenge und darin die Datei V4wH9uEGJAvmCcGQJOLypYr8kMuVCEl1S05iqzyvv2M angelegt werden. Inhalt dieser Datei soll die Zeichenkette V4wH9uEGJAvmCcGQJOLypYr8kMuVCEl1S05iqzyvv2M.xCd_mSgGAVbCIfp5Ol-Wd0omTFH-95f6HeVCmrdeHD8 sein:

2.-Challenge
2.-Challenge

Wenn alles, wie gewünscht, angelegt ist, können wir wieder auf ⏎ drücken. War die Zertifizierung erfolgreich, sieht die Meldung so aus:

"Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/nodeweb.tk/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/nodeweb.tk/privkey.pem
   Your cert will expire on 2021-03-31. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   'certbot renew'
 - 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"
anton_beton@web-node-server:~$ 

Da es nur eine Testzertifizierung war, muss die eigentliche Zertifizierung mit obigem Kommando, jetzt aber ohne den Parameter --test-cert, gestartet werden. Der Ablauf ist identisch, allerdings mit anderen Parametern.

Die Zertifikate auf der virtuellen Maschine lassen sich mit folgendem Kommando auflisten:
sudo certbot certificates