Modul 7 · 7.3
https med Let's Encrypt
Modul 7: Domän, webbserver och https · Lästid: 12 minuter
Lärandemål: Efter den här lektionen kan du med certbot beställa ett gratis certifikat från Let's Encrypt för nginx, skicka vidare http till https, kontrollera den automatiska förnyelsen och lösa de vanligaste felen vid en beställning.
Nyckelbegrepp: certifikat, certifikatutfärdare (CA), ACME, Let's Encrypt, domänvalidering, HTTP-01, DNS-01, TLS-ALPN-01, certbot, förnyelse, certbot renew --dry-run, giltighetstid, ARI, rate limits, staging, CAA, vidarebefordran till https
Varför https, och vad ett certifikat bevisar
Utan https går allt mellan webbläsare och server okrypterat över nätverket: lösenord, formulär, cookies. Vem som helst på vägen (ett öppet wifi, en hackad router) kan läsa med eller ändra något. Därför markerar webbläsare http-sajter som "inte säker", och vissa funktioner fungerar bara via https. För ett lösenordsvalv som Vaultwarden (lektion 9.4) är https till och med ett krav.
https använder TLS, och för det behöver din server ett certifikat: ett bevis, signerat av en certifikatutfärdare (CA) som webbläsare litar på, att den här nyckeln hör till det här namnet. Ett vanligt certifikat bevisar bara att den som beställde det har kontroll över domännamnet (domänvalidering). Det säger ingenting om vem du är eller om du är pålitlig.
Let's Encrypt är en gratis CA som bara utfärdar domänvaliderade certifikat, helt automatiskt via protokollet ACME. Ett program på din server (ACME-klienten) beställer certifikatet, bevisar att det har kontroll över namnet, installerar det och förnyar det i tid. Den här lektionen använder certbot, klienten från EFF. Caddy (lektion 7.4) har en inbyggd ACME-klient.
Hur bevisar du att du har kontroll över namnet?
Let's Encrypt har tre sorters utmaningar (challenges):
| Utmaning | Hur | Port | Wildcard (*.example.com) |
|---|---|---|---|
| HTTP-01 | lägga en fil under http://<naam>/.well-known/acme-challenge/ | 80 | nej |
| DNS-01 | skapa en TXT-post _acme-challenge.<naam> | ingen | ja |
| TLS-ALPN-01 | visa ett särskilt certifikat under TLS-handskakningen | 443 | nej |
För en vanlig VPS med en webbplats är HTTP-01 enklast. Då måste:
- namnet peka på din server med A (och AAAA) (lektion 7.1);
- port 80 vara öppen för hela världen, även om din sajt annars bara använder https. Let's Encrypt validerar bara via port 80 och från flera platser på internet; de adresserna kan du inte lägga in i din brandvägg;
- din server svara likadant via IPv4 och IPv6. Har namnet en AAAA-post försöker Let's Encrypt med IPv6 först. Bara om IPv6 inte ger någon anslutning alls faller det tillbaka på IPv4.
DNS-01 behöver du för ett wildcardcertifikat, eller om servern inte går att nå utifrån. Då måste ACME-klienten kunna ändra din DNS, oftast via en API-nyckel från din DNS-leverantör. Den nyckeln kan ändra hela din DNS: förvara den lika omsorgsfullt som ett lösenord.
Installera certbot
Utvecklarna av certbot rekommenderar snap, eftersom den alltid har den senaste versionen. På Debian och Ubuntu går det också bra från paketkällan:
anna@web1:~$ sudo apt install certbot python3-certbot-nginxVersionen från distributionen är äldre men får säkerhetsuppdateringar via apt (lektion 4.1 och 4.2), och det passar resten av den här kursen. Välj ett av de två, inte båda: två installationer kommer i vägen för varandra vid förnyelsen.
Beställa ett certifikat
Med sajten från lektion 7.2 redan igång 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(Datum och detaljer är ett exempel.) Pluginet --nginx gör tre saker: det lägger tillfälligt ut utmaningen, hämtar certifikatet och ändrar ditt server block med ett listen 443 ssl-block och en omdirigering från http till https. Vill du hellre göra det själv, använd certbot certonly --nginx och skriv in raderna i din konfiguration själv.
Några saker att tänka på:
- Beställ alla namn som hör till sajten på en gång (
-dper namn). Varje namn måste peka på servern, annars misslyckas hela beställningen. - Den privata nyckeln (
privkey.pem) ligger i/etc/letsencrypt/live/och kan bara läsas av root. Kopiera den inte till andra ställen och lägg den aldrig i en säkerhetskopia som andra kan läsa. - E-postadressen är valfri. Sedan juni 2025 skickar Let's Encrypt inga mejl längre när ett certifikat snart går ut. Du måste alltså själv bevaka att förnyelsen lyckas (lektion 8.3).
Skicka vidare http till https
Efter certbot ser din konfiguration ut ungefär så här (rensad; certbot lägger själv till kommentaren # managed by Certbot och ibland if-rader):
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;
...
}Det första blocket skickar allt via http vidare till samma namn och samma sökväg via https, med en permanent omdirigering (301). Utmaningsfilen för förnyelsen fungerar fortfarande: Let's Encrypt följer omdirigeringen. Det andra blocket är den riktiga sajten. Vill du också skicka www till det kala namnet (eller tvärtom), gör det i ett eget block, så att besökarna ser ett fast namn.
Förnyelse: automatisk, och kontrollerad
Ett certifikat från Let's Encrypt gäller nu i 90 dagar. Det blir kortare: Let's Encrypt har meddelat att standardprofilen från den 10 februari 2027 utfärdar certifikat på 64 dagar och från den 16 februari 2028 på 45 dagar. Att förnya för hand är alltså inget alternativ; det måste ske automatiskt.
Vid installationen lägger certbot in en systemd-timer (eller en cronrad) som två gånger om dagen kollar om ett certifikat behöver förnyas. Kontrollera att den finns, och testa förnyelsen med en provbeställning:
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 förnyelsen måste nginx också läsa in det nya certifikatet. Med nginx-pluginet sköter certbot det själv; använder du certonly, lägg då in en deploy hook som laddar om nginx, till exempel ett körbart skript i /etc/letsencrypt/renewal-hooks/deploy/ med systemctl reload nginx.
Bra ACME-klienter använder ARI (ACME Renewal Information): då talar Let's Encrypt själv om när ett certifikat ska förnyas, till exempel tidigare om något är fel med en serie certifikat. Håll därför din klient uppdaterad.
När en beställning misslyckas
| Meddelande (förkortat) | Orsak | Lösning |
|---|---|---|
Timeout during connect (likely firewall problem) | port 80 stängd, eller namnet pekar på en annan adress | brandvägg (lektion 5.2), A/AAAA (lektion 7.1) |
Invalid response from http://.../.well-known/acme-challenge/...: 404 | en annan server eller ett annat server block svarar, ofta via IPv6 | listen [::]:80, kontrollera AAAA-posten |
CAA record for example.com prevents issuance | en CAA-post tillåter bara en annan utfärdare | ändra CAA (lektion 7.1) |
too many certificates already issued | en rate limit | vänta; testa med staging |
Let's Encrypt har rate limits för att förhindra missbruk. De viktigaste: högst 50 nya certifikat per registrerad domän per 7 dagar, högst 5 certifikat för exakt samma uppsättning namn per 7 dagar och högst 5 misslyckade valideringar per namn per timme. Den som provar sig fram och beställer om och om igen slår snabbt i taket. Testa därför med staging-miljön, som har mycket generösare gränser men ger certifikat som webbläsare inte litar på:
anna@web1:~$ sudo certbot certonly --nginx --staging -d test.example.comFungerar det där, beställ då det riktiga certifikatet.
På AlmaLinux och Rocky Linux
Där kommer certbot från EPEL (dnf install certbot python3-certbot-nginx) eller som snap. Pluginet och kommandona är desamma. Tänk på firewalld (--add-service=http --add-service=https) och på SELinux om certifikaten ligger på ett ovanligt ställe.
I praktiken
Med ett webbhotellspaket sköter panelen certifikatet åt dig (hos WebOké och hos andra webbhotell med DirectAdmin, cPanel eller Plesk). På en VPS gör du det själv, med certbot, Caddy eller den ACME-klient som hör till din programvara. Det gäller hos alla leverantörer.
Sammanfattning
- Ett certifikat från Let's Encrypt bevisar att du har kontroll över namnet; certbot beställer, installerar och förnyar det via ACME.
- HTTP-01 kräver att port 80 är öppen för alla, och samma svar via IPv4 och IPv6; DNS-01 är till för wildcards.
certbot --nginx -d ... -d ...sköter certifikatet och vidarebefordran till https; beställ alla namn för en sajt på en gång.- Certifikat gäller nu i 90 dagar och blir kortare; kontrollera timern och
certbot renew --dry-run, och bevaka själv utgångsdatumet. - Testa med
--stagingför att undvika rate limits; tänk på CAA.
Quiz
Uppgift
Uppgift Z7.3: https med ett giltigt certifikat. Beställ ett certifikat för din sajt (med certbot eller Caddy), skicka vidare http till https och testa förnyelsen med certbot renew --dry-run (med Caddy: titta i loggarna om certifikatet har hämtats). Fyll i namnet på din sajt. Programmet gör en TLS-anslutning till port 443 och kontrollerar om certifikatet är giltigt, signerat av en betrodd utfärdare och täcker ditt namn, och hämtar sedan http://<naam>/ för att se om du skickar vidare till https. Dessutom fyller du i när ditt certifikat går ut och hur förnyelsen är ordnad hos dig.
Läs mer
- SSL-certifikat: aktivera, förnya och felsöka
- Gratis DNS-kurs 5.2: CAA: vem får utfärda certifikat?
- 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
- Instruktioner för certbot (nginx): https://certbot.eff.org/instructions?ws=nginx&os=snap
