Gå direkte til indholdet

Cookieindstillinger

Vælg for hver type, hvilke cookies du tillader. Du kan altid ændre dit valg via Cookieindstillinger nederst på hver side. Privatlivspolitik

Nødvendige

Altid slået til

Nødvendige for at logge ind, gemme din kurv og huske dine valg. De er altid slået til.

Hvilke cookies?
  • weboke_sessie, weboke_klant, weboke_remember: din session og at forblive logget ind
  • weboke_basket: din kurv
  • wkBtwIncl: vise priser med eller uden moms
  • wok_cookies: dit cookievalg, 12 måneder

Måler, hvilken annonce der fører til et besøg eller en bestilling, så vi ikke betaler for annoncer, der ikke virker.

Hvilke cookies?
  • Google Ads via Google Tag Manager (_gcl_au, _gcl_aw), op til 90 dage
  • OpenAI Ads, annoncer i ChatGPT
  • wok_aff: hvilken partner der henviste dig til os (affiliateprogram), 60 dage

4,6

Land og sprog

Hvert land har sin egen side med landets priser og moms.

Se

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):

UdfordringHvordanPortWildcard (*.example.com)
HTTP-01læg en fil under http://<naam>/.well-known/acme-challenge/80nej
DNS-01opret en TXT-record _acme-challenge.<naam>ingenja
TLS-ALPN-01vis et særligt certifikat under TLS-handshaket443nej

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-nginx

Versionen 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 (-d pr. 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)ÅrsagLøsning
Timeout during connect (likely firewall problem)port 80 lukket, eller navnet peger på en anden adressefirewall (lektion 5.2), A/AAAA (lektion 7.1)
Invalid response from http://.../.well-known/acme-challenge/...: 404en anden server eller en anden server block svarer, ofte via IPv6listen [::]:80, tjek AAAA-recorden
CAA record for example.com prevents issuanceen CAA-record tillader kun en anden udstedertilpas CAA (lektion 7.1)
too many certificates already issueden rate limitvent; 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.com

Virker 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 --staging for at undgå rate limits; hold øje med CAA.

Quiz

1. Dit site skal kun kunne nås via https. Må du så lukke port 80 i firewallen, hvis du bruger HTTP-01?



2. Du vil have et certifikat til *.example.com. Hvilken udfordring skal du bruge?



3. Anmodningen fejler med en 404 på challengefilen, mens curl http://example.com/ viser dit site via IPv4. Hvad er den mest sandsynlige årsag?



4. Hvorfor er automatisk fornyelse vigtigere end nogensinde?



5. Du eksperimenterer og har i dag allerede anmodet om det samme certifikat fire gange. Hvad gør du ved næste forsøg?



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.

Opgave Z7.3: https med et gyldigt certifikat

Kun for tilmeldte kursister. Vi åbner https://<naam>/ og http://<naam>/ som en browser, fra vores webserver.




Det, du udfylder, og hvad vi finder, gemmer vi ikke. Din browser husker dine svar, og om du har bestået opgaven. Er du logget ind, gemmer vi kun, at du (næsten) bestod opgaven, i Mine kurser; der kan du også slette det.

Læs mere

Et øjeblik…

Opsæt dine domæner

Angiv for hvert domæne navneserverne, tilknytningen til din hosting, og hvem der bliver ejer.

Indlæser dine domæner…