Hoppa till innehållet

Cookieinställningar

Välj vilka typer av cookies du tillåter. Du kan alltid ändra ditt val via Cookieinställningar längst ned på varje sida. Integritetspolicy

Nödvändiga

Alltid på

Behövs för att logga in, spara din varukorg och komma ihåg dina val. De är alltid på.

Vilka cookies?
  • weboke_sessie, weboke_klant, weboke_remember: din session och att du förblir inloggad
  • weboke_basket: din varukorg
  • wkBtwIncl: visa priser med eller utan moms
  • wok_cookies: ditt cookieval, 12 månader

Mäter vilken annons som leder till ett besök eller en beställning, så att vi inte betalar för annonser som inte ger något.

Vilka cookies?
  • Google Ads via Google Tag Manager (_gcl_au, _gcl_aw), upp till 90 dagar
  • OpenAI Ads, annonser i ChatGPT
  • wok_aff: via vilken partner du kom till oss (affiliateprogram), 60 dagar

4,6

Land och språk

Varje land har en egen webbplats med landets priser och moms.

Visa

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

UtmaningHurPortWildcard (*.example.com)
HTTP-01lägga en fil under http://<naam>/.well-known/acme-challenge/80nej
DNS-01skapa en TXT-post _acme-challenge.<naam>ingenja
TLS-ALPN-01visa ett särskilt certifikat under TLS-handskakningen443nej

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

Versionen 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 (-d per 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)OrsakLösning
Timeout during connect (likely firewall problem)port 80 stängd, eller namnet pekar på en annan adressbrandvägg (lektion 5.2), A/AAAA (lektion 7.1)
Invalid response from http://.../.well-known/acme-challenge/...: 404en annan server eller ett annat server block svarar, ofta via IPv6listen [::]:80, kontrollera AAAA-posten
CAA record for example.com prevents issuanceen CAA-post tillåter bara en annan utfärdareändra CAA (lektion 7.1)
too many certificates already issueden rate limitvä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.com

Fungerar 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 --staging för att undvika rate limits; tänk på CAA.

Quiz

1. Din sajt ska bara gå att nå via https. Får du då stänga port 80 i brandväggen om du använder HTTP-01?



2. Du vill ha ett certifikat för *.example.com. Vilken utmaning behöver du?



3. Beställningen misslyckas med en 404 på utmaningsfilen, medan curl http://example.com/ via IPv4 visar din sajt. Vad är den troligaste orsaken?



4. Varför är automatisk förnyelse viktigare än någonsin?



5. Du experimenterar och har redan beställt samma certifikat fyra gånger i dag. Vad gör du inför nästa försök?



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.

Uppgift Z7.3: https med ett giltigt certifikat

Bara för inloggade kursdeltagare. Vi öppnar https://<naam>/ och http://<naam>/ som en webbläsare, från vår webbserver.




Det du fyller i och det vi hittar sparar vi inte. Din webbläsare kommer ihåg dina svar och om du klarade uppgiften. Är du inloggad sparar vi bara att du klarade uppgiften (nästan) i Mina kurser; där kan du också ta bort det.

Läs mer

Ett ögonblick…

Ställ in dina domäner

Ställ in namnservrar, koppling till ditt webbhotell och vem som blir innehavare för varje domän.

Hämtar dina domäner…