Modul 7 · 7.3
https med Let's Encrypt
Modul 7: Domene, webserver og https · Lesetid: 12 minutter
Læringsmål: Etter denne leksjonen kan du bruke certbot til å bestille et gratis sertifikat fra Let's Encrypt for nginx, sende http videre til https, kontrollere den automatiske fornyelsen og løse de vanligste feilene ved en bestilling.
Nøkkelbegreper: sertifikat, sertifikatutsteder (CA), ACME, Let's Encrypt, domenevalidering, HTTP-01, DNS-01, TLS-ALPN-01, certbot, fornyelse, certbot renew --dry-run, gyldighetstid, ARI, rate limits, staging, CAA, videresending til https
Hvorfor https, og hva et sertifikat beviser
Uten https går alt mellom nettleser og server ukryptert over nettverket: passord, skjemaer, informasjonskapsler. Alle underveis (et offentlig wifi-nett, en hacket ruter) kan lese med eller endre noe. Nettlesere merker derfor http-nettsteder som "ikke sikker", og noen funksjoner virker bare over https. For et passordhvelv som Vaultwarden (leksjon 9.4) er https til og med påkrevd.
https bruker TLS, og til det trenger serveren din et sertifikat: et bevis, signert av en sertifikatutsteder (CA) som nettleserne stoler på, for at denne nøkkelen hører til dette navnet. Et vanlig sertifikat beviser bare at den som bestiller kontrollerer domenenavnet (domenevalidering). Det sier ingenting om hvem du er eller om du er til å stole på.
Let's Encrypt er en gratis CA som bare utsteder domenevaliderte sertifikater, helt automatisk via ACME-protokollen. Et program på serveren din (ACME-klienten) bestiller sertifikatet, beviser at det kontrollerer navnet, installerer det og fornyer det i tide. Denne leksjonen bruker certbot, klienten fra EFF. Caddy (leksjon 7.4) har en innebygd ACME-klient.
Hvordan beviser du at du kontrollerer navnet?
Let's Encrypt har tre typer utfordringer (challenges):
| Utfordring | Hvordan | Port | Wildcard (*.example.com) |
|---|---|---|---|
| HTTP-01 | legge en fil under http://<naam>/.well-known/acme-challenge/ | 80 | nei |
| DNS-01 | legge inn en TXT-post _acme-challenge.<naam> | ingen | ja |
| TLS-ALPN-01 | vise et spesielt sertifikat under TLS-håndtrykket | 443 | nei |
For en vanlig VPS med et nettsted er HTTP-01 enklest. Da må:
- navnet peke til serveren din med A (og AAAA) (leksjon 7.1);
- port 80 være åpen for hele verden, også om nettstedet ellers bare bruker https. Let's Encrypt validerer bare via port 80 og fra flere steder på internett; du kan ikke legge inn de adressene i brannmuren;
- serveren din svare likt over IPv4 og IPv6. Har navnet en AAAA-post, prøver Let's Encrypt IPv6 først. Bare hvis IPv6 ikke gir noen forbindelse i det hele tatt, faller den tilbake til IPv4.
DNS-01 trenger du for et wildcardsertifikat, eller hvis serveren ikke kan nås utenfra. Da må ACME-klienten kunne endre DNS-en din, som regel via en API-nøkkel fra DNS-leverandøren. Den nøkkelen kan endre hele DNS-en din: ta vare på den like nøye som et passord.
Installere certbot
Utviklerne av certbot anbefaler snap-pakken, fordi den alltid har nyeste versjon. På Debian og Ubuntu kan du også bare hente den fra pakkekilden:
anna@web1:~$ sudo apt install certbot python3-certbot-nginxVersjonen fra distribusjonen er eldre, men får sikkerhetsoppdateringer via apt (leksjon 4.1 og 4.2), og det passer med resten av dette kurset. Velg én av de to, ikke begge: to installasjoner går i beina på hverandre når de skal fornye.
Bestille et sertifikat
Med nettstedet fra leksjon 7.2 allerede i drift 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.) Plugin-en --nginx gjør tre ting: den setter midlertidig opp utfordringen, henter sertifikatet og endrer server-blokken din med en listen 443 ssl-blokk og en videresending fra http til https. Vil du heller gjøre det selv, bruker du certbot certonly --nginx og legger linjene inn i konfigurasjonen selv.
Noen ting du bør passe på:
- Bestill alle navnene som hører til nettstedet på én gang (
-dper navn). Hvert navn må peke til serveren, ellers mislykkes hele bestillingen. - Den private nøkkelen (
privkey.pem) ligger i/etc/letsencrypt/live/og kan bare leses av root. Ikke kopier den til andre steder, og legg den aldri i en sikkerhetskopi som andre kan lese. - E-postadressen er valgfri. Siden juni 2025 sender Let's Encrypt ikke lenger e-post når et sertifikat snart går ut. Du må altså selv overvåke at fornyelsen lykkes (leksjon 8.3).
Sende http videre til https
Etter certbot ser konfigurasjonen din omtrent slik ut (ryddet; certbot legger selv til kommentarer # managed by Certbot og noen ganger 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 blokken sender alt over http videre til samme navn og samme sti over https, med en permanent videresending (301). Utfordringsfilen for fornyelse virker fortsatt: Let's Encrypt følger den videresendingen. Den andre blokken er selve nettstedet. Vil du også sende www videre til navnet uten prefiks (eller omvendt), gjør du det i en egen blokk, slik at besøkende ser ett fast navn.
Fornyelse: automatisk, og kontrollert
Et sertifikat fra Let's Encrypt er nå gyldig i 90 dager. Det blir kortere: Let's Encrypt har varslet at standardprofilen fra 10. februar 2027 utsteder sertifikater på 64 dager og fra 16. februar 2028 på 45 dager. Manuell fornyelse er derfor ikke et alternativ; det må skje automatisk.
Ved installasjonen legger certbot inn en systemd-timer (eller en cron-linje) som to ganger om dagen sjekker om et sertifikat må fornyes. Kontroller at den finnes, og test fornyelsen med en prøvebestilling:
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)Etter fornyelsen må nginx også laste inn det nye sertifikatet. Med nginx-plugin-en ordner certbot det selv; bruker du certonly, legger du inn en deploy hook som laster nginx på nytt, for eksempel et kjørbart skript i /etc/letsencrypt/renewal-hooks/deploy/ med systemctl reload nginx.
Gode ACME-klienter bruker ARI (ACME Renewal Information): Da sier Let's Encrypt selv når et sertifikat skal fornyes, for eksempel tidligere hvis noe er galt med en serie sertifikater. Hold derfor klienten oppdatert.
Når en bestilling mislykkes
| Melding (forkortet) | Årsak | Løsning |
|---|---|---|
Timeout during connect (likely firewall problem) | port 80 er stengt, eller navnet peker til en annen adresse | brannmur (leksjon 5.2), A/AAAA (leksjon 7.1) |
Invalid response from http://.../.well-known/acme-challenge/...: 404 | en annen server eller en annen server-blokk svarer, ofte via IPv6 | listen [::]:80, sjekk AAAA-posten |
CAA record for example.com prevents issuance | en CAA-post tillater bare en annen utsteder | endre CAA (leksjon 7.1) |
too many certificates already issued | en rate limit | vent; test med staging |
Let's Encrypt har rate limits for å hindre misbruk. De viktigste: maks 50 nye sertifikater per registrert domene per 7 dager, maks 5 sertifikater for nøyaktig samme sett med navn per 7 dager, og maks 5 mislykkede valideringer per navn per time. Prøver du deg frem og bestiller om og om igjen, når du fort grensen. Test derfor med staging-miljøet, som har mye rausere grenser, men gir sertifikater som nettlesere ikke stoler på:
anna@web1:~$ sudo certbot certonly --nginx --staging -d test.example.comVirker det der, bestiller du det ekte sertifikatet.
På AlmaLinux og Rocky Linux
Der kommer certbot fra EPEL (dnf install certbot python3-certbot-nginx) eller som snap. Plugin-en og kommandoene er de samme. Husk firewalld (--add-service=http --add-service=https) og SELinux hvis sertifikatene ligger på et uvanlig sted.
I praksis
Med en webhotellpakke ordner kontrollpanelet sertifikatet for deg (hos WebOké og hos andre leverandører med DirectAdmin, cPanel eller Plesk). På en VPS gjør du det selv, med certbot, Caddy eller ACME-klienten som følger med programvaren din. Det gjelder hos alle leverandører.
Sammendrag
- Et sertifikat fra Let's Encrypt beviser at du kontrollerer navnet; certbot bestiller, installerer og fornyer det via ACME.
- HTTP-01 krever at port 80 er åpen, for alle, og samme svar over IPv4 og IPv6; DNS-01 er for wildcards.
certbot --nginx -d ... -d ...ordner sertifikatet og videresendingen til https; bestill alle navnene til et nettsted på én gang.- Sertifikater er nå gyldige i 90 dager og blir kortere; kontroller timeren og
certbot renew --dry-run, og overvåk utløpsdatoen selv. - Test med
--stagingfor å unngå rate limits; vær oppmerksom på CAA.
Quiz
Oppgave
Oppgave Z7.3: https med et gyldig sertifikat. Bestill et sertifikat for nettstedet ditt (med certbot eller Caddy), send http videre til https og test fornyelsen med certbot renew --dry-run (med Caddy: se i loggene om sertifikatet er hentet). Fyll inn navnet på nettstedet ditt. Programmet åpner en TLS-forbindelse til port 443 og kontrollerer om sertifikatet er gyldig, er signert av en utsteder som er til å stole på og dekker navnet ditt, og henter deretter http://<naam>/ for å se om du sender videre til https. I tillegg fyller du inn når sertifikatet ditt går ut og hvordan fornyelsen er ordnet hos deg.
Les mer
- Aktivere, fornye og feilsøke SSL-sertifikat
- Gratis DNS-kurs 5.2: CAA: hvem har lov til å utstede sertifikater?
- 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-instruksjoner (nginx): https://certbot.eff.org/instructions?ws=nginx&os=snap
