Modul 7 · 7.3
https med Let's Encrypt
Modul 7: Domæne, webserver og https · Læsetid: 12 minutter
Læringsmål: Efter denne lektion kan du bruge certbot til at hente et gratis certifikat fra Let's Encrypt til nginx, sende http videre til https, kontrollere den automatiske fornyelse og løse de mest almindelige fejl ved en anmodning.
Centrale begreber: certifikat, certifikatudsteder (CA), ACME, Let's Encrypt, domænevalidering, HTTP-01, DNS-01, TLS-ALPN-01, certbot, fornyelse, certbot renew --dry-run, gyldighedsperiode, ARI, rate limits, staging, CAA, videresendelse til https
Hvorfor https, og hvad et certifikat beviser
Uden https går alt mellem browser og server ukrypteret over netværket: adgangskoder, formularer, cookies. Alle undervejs (et offentligt wifi, en hacket router) kan læse med eller ændre noget. Derfor markerer browsere http-sites som "ikke sikker", og nogle funktioner virker kun via https. Til en boks som Vaultwarden (lektion 9.4) er https endda et krav.
https bruger TLS, og til det skal din server have et certifikat: et bevis, underskrevet af en certifikatudsteder (CA) som browsere stoler på, for at denne nøgle hører til dette navn. Et almindeligt certifikat beviser kun, at den, der har bestilt det, styrer domænenavnet (domænevalidering). Det siger intet om, hvem du er, eller om du er til at stole på.
Let's Encrypt er en gratis CA, der kun udsteder domænevaliderede certifikater, helt automatisk via ACME-protokollen. Et program på din server (ACME-klienten) anmoder om certifikatet, beviser at det styrer navnet, installerer det og fornyer det i god tid. Denne lektion bruger certbot, klienten fra EFF. Caddy (lektion 7.4) har en indbygget ACME-klient.
Hvordan beviser du, at du styrer navnet?
Let's Encrypt har tre slags udfordringer (challenges):
| Udfordring | Hvordan | Port | Wildcard (*.example.com) |
|---|---|---|---|
| HTTP-01 | læg en fil under http://<naam>/.well-known/acme-challenge/ | 80 | nej |
| DNS-01 | opret en TXT-record _acme-challenge.<naam> | ingen | ja |
| TLS-ALPN-01 | vis et særligt certifikat under TLS-handshaket | 443 | nej |
Til en almindelig VPS med et website er HTTP-01 det enkleste. Det kræver, at:
- navnet peger på din server med A (og AAAA) (lektion 7.1);
- port 80 er åben for hele verden, også selvom dit site ellers kun bruger https. Let's Encrypt validerer kun via port 80 og fra flere steder på internettet; du kan ikke sætte de adresser ind i din firewall;
- din server svarer det samme via IPv4 og IPv6. Har navnet en AAAA-record, prøver Let's Encrypt IPv6 først. Kun hvis IPv6 slet ikke giver forbindelse, falder det tilbage på IPv4.
DNS-01 skal du bruge til et wildcardcertifikat, eller hvis serveren ikke kan nås udefra. Så skal ACME-klienten kunne ændre din DNS, som regel via en API-nøgle fra din DNS-udbyder. Den nøgle kan ændre hele din DNS: pas lige så godt på den som på en adgangskode.
Installér certbot
Udviklerne af certbot anbefaler snap-pakken, fordi den altid har den nyeste version. På Debian og Ubuntu kan du også bare hente den fra pakkekilden:
anna@web1:~$ sudo apt install certbot python3-certbot-nginxVersionen fra distributionen er ældre, men får sikkerhedsopdateringer via apt (lektion 4.1 og 4.2), og det passer til resten af dette kursus. Vælg én af de to, ikke begge: to installationer kommer i vejen for hinanden ved fornyelse.
Anmod om et certifikat
Med sitet fra lektion 7.2 allerede kørende på port 80:
anna@web1:~$ sudo certbot --nginx -d example.com -d www.example.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address or hit Enter to skip.
(Enter 'c' to cancel):
...
Requesting a certificate for example.com and www.example.com
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem
This certificate expires on 2027-02-07.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for example.com to /etc/nginx/sites-enabled/example.com
Successfully deployed certificate for www.example.com to /etc/nginx/sites-enabled/example.com
Congratulations! You have successfully enabled HTTPS on https://example.com and https://www.example.com(Dato og detaljer er et eksempel.) Plug-in'et --nginx gør tre ting: det lægger midlertidigt challengen klar, henter certifikatet og tilpasser din server block med en listen 443 ssl-blok og en videresendelse fra http til https. Vil du hellere gøre det selv, så brug certbot certonly --nginx og skriv linjerne ind i din konfiguration selv.
Et par ting, du skal holde øje med:
- Anmod om alle navne på én gang, som hører til sitet (
-dpr. navn). Hvert navn skal pege på serveren, ellers mislykkes hele anmodningen. - Den private nøgle (
privkey.pem) ligger i/etc/letsencrypt/live/og kan kun læses af root. Kopiér den ikke andre steder hen, og læg den aldrig i en backup, som andre kan læse. - Mailadressen er valgfri. Siden juni 2025 sender Let's Encrypt ikke længere mails, når et certifikat snart udløber. Du skal altså selv overvåge, at fornyelsen lykkes (lektion 8.3).
Send http videre til https
Efter certbot ser din konfiguration nogenlunde sådan ud (ryddet op; certbot tilføjer selv kommentarer # managed by Certbot og nogle gange if-linjer):
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
root /var/www/example.com;
...
}Den første blok sender alt via http videre til samme navn og samme sti via https, med en permanent videresendelse (301). Challengefilen til fornyelse virker stadig: Let's Encrypt følger videresendelsen. Den anden blok er det egentlige site. Vil du også sende www videre til det rene navn (eller omvendt), så gør det i en separat blok, så besøgende ser ét fast navn.
Fornyelse: automatisk, og kontrollér den
Et certifikat fra Let's Encrypt er i dag gyldigt i 90 dage. Det bliver kortere: Let's Encrypt har meldt ud, at standardprofilen fra 10 februari 2027 udsteder certifikater på 64 dage og fra 16 februari 2028 på 45 dage. At forny i hånden er altså ikke en mulighed; det skal ske automatisk.
Ved installationen opretter certbot en systemd-timer (eller en cronlinje), der to gange om dagen tjekker, om et certifikat skal fornyes. Kontrollér, at den findes, og test fornyelsen med en prøveanmodning:
anna@web1:~$ systemctl list-timers 'certbot*'
NEXT LEFT LAST PASSED UNIT ACTIVATES
Mon 2026-11-09 22:41:00 CET 9h left - - certbot.timer certbot.service
anna@web1:~$ sudo certbot renew --dry-run
...
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/example.com/fullchain.pem (success)Efter fornyelsen skal nginx også indlæse det nye certifikat. Med nginx-plug-in'et klarer certbot det selv; bruger du certonly, så opret en deploy hook, der genindlæser nginx, for eksempel et eksekverbart script i /etc/letsencrypt/renewal-hooks/deploy/ med systemctl reload nginx.
Gode ACME-klienter bruger ARI (ACME Renewal Information): så fortæller Let's Encrypt selv, hvornår et certifikat skal fornyes, for eksempel tidligere hvis der er noget galt med en række certifikater. Hold derfor din klient opdateret.
Hvis en anmodning mislykkes
| Meddelelse (forkortet) | Årsag | Løsning |
|---|---|---|
Timeout during connect (likely firewall problem) | port 80 lukket, eller navnet peger på en anden adresse | firewall (lektion 5.2), A/AAAA (lektion 7.1) |
Invalid response from http://.../.well-known/acme-challenge/...: 404 | en anden server eller en anden server block svarer, ofte via IPv6 | listen [::]:80, tjek AAAA-recorden |
CAA record for example.com prevents issuance | en CAA-record tillader kun en anden udsteder | tilpas CAA (lektion 7.1) |
too many certificates already issued | en rate limit | vent; test med staging |
Let's Encrypt har rate limits for at forhindre misbrug. De vigtigste: højst 50 nye certifikater pr. registreret domæne pr. 7 dage, højst 5 certifikater for præcis det samme sæt navne pr. 7 dage og højst 5 mislykkede valideringer pr. navn pr. time. Hvis du eksperimenterer og anmoder igen og igen, rammer du hurtigt grænserne. Test derfor med staging-miljøet, som har meget rummeligere grænser, men udsteder certifikater, som browsere ikke stoler på:
anna@web1:~$ sudo certbot certonly --nginx --staging -d test.example.comVirker det der, så anmod om det rigtige certifikat.
På AlmaLinux og Rocky Linux
Her kommer certbot fra EPEL (dnf install certbot python3-certbot-nginx) eller som snap. Plug-in'et og kommandoerne er de samme. Husk firewalld (--add-service=http --add-service=https) og SELinux, hvis certifikaterne ligger et usædvanligt sted.
I praksis
Med et hostingabonnement klarer panelet certifikatet for dig (hos WebOké og hos andre hostingfirmaer med DirectAdmin, cPanel eller Plesk). På en VPS gør du det selv, med certbot, Caddy eller den ACME-klient, der følger med din software. Det gælder hos alle udbydere.
Opsummering
- Et certifikat fra Let's Encrypt beviser, at du styrer navnet; certbot anmoder om det, installerer og fornyer det via ACME.
- HTTP-01 kræver, at port 80 er åben for alle, og det samme svar via IPv4 og IPv6; DNS-01 er til wildcards.
certbot --nginx -d ... -d ...klarer certifikat og videresendelse til https; anmod om alle navne for et site på én gang.- Certifikater er i dag gyldige i 90 dage og bliver kortere; kontrollér timeren og
certbot renew --dry-run, og overvåg selv udløbsdatoen. - Test med
--stagingfor at undgå rate limits; hold øje med CAA.
Quiz
Opgave
Opgave Z7.3: https med et gyldigt certifikat. Anmod om et certifikat til dit site (med certbot eller Caddy), send http videre til https, og test fornyelsen med certbot renew --dry-run (med Caddy: se i logfilerne, om certifikatet er hentet). Udfyld navnet på dit site. Programmet opretter en TLS-forbindelse til port 443 og kontrollerer, om certifikatet er gyldigt, er underskrevet af en betroet udsteder og dækker dit navn, og henter derefter http://<naam>/ for at se, om du sender videre til https. Derudover udfylder du, hvornår dit certifikat udløber, og hvordan fornyelsen er sat op hos dig.
Læs mere
- Aktivér, forny og fejlfind SSL-certifikat
- Gratis DNS-kursus 5.2: CAA: hvem må udstede certifikater?
- Let's Encrypt, Challenge Types: https://letsencrypt.org/docs/challenge-types/
- Let's Encrypt, Rate Limits: https://letsencrypt.org/docs/rate-limits/
- Let's Encrypt, Decreasing Certificate Lifetimes to 45 Days: https://letsencrypt.org/2025/12/02/from-90-to-45
- Certbot-vejledning (nginx): https://certbot.eff.org/instructions?ws=nginx&os=snap
- Kortere gyldighedsperioder for Let's Encrypt-certifikater: hvad betyder det for dig?
- VPS: fra første login til sikker server 5.2: nginx med et certifikat fra Let's Encrypt
