Let's Encrypt
Siden våren 2016 har Samfundet tatt i bruk Let's Encrypt som CA for å utstede X.509-sertifikater for TLS. cirkus tar i bruk hitch som SSL-terminator, som betyr at alle virtualhosts her skal bruke port 80. altersex og cassarossa terminerer i Apache.
Let's Encrypts sertifikater har en levetid på kun 90 dager, men automatiserer prosessen for å fornye disse, dette for å begrense skaden gjort ved kompromittering av nøkler og feilutstedelser.
Challenge-protokoller
Let's Encrypt utsteder bare et sertifikat til oss for et domenet hvis vi kan bevise at vi eier det. Dette kan gjøres på flere måter, men på Samfundet tar vi i hovedsak i bruk http-01 og dns-01. Felles for begge er at ACME-serveren (Automated Certificate Management Environment) gir oss en challenge. Når ACME-serveren dertter kobler seg til det aktuelle domenet, forventer den å få challengen som svar.
- Ved http-01 serverer vi challenge over http fra en bestemt plassering under det aktuelle domenet. Dette brukes av webroot-pluginen.
- Ved dns-01 legger vi challengen som en TXT-record for domenet i DNS.
Vi bruker gjerne http-01 for nettsider, og dns-01 for ikke-nettsider.
Boks | Challenge-protokoll | Plugin |
---|---|---|
cirkus | http-01 | varnish+hitch |
altersex | http-01, dns-01 | webroot, manuell |
casssarossa | http-01 dns-01 | webroot, manuell |
http-01
Ved http-01 gir ACME-serveren oss en challenge, som den forventer å få som svar over http. Vi sørger for at webserveren vår har en VirtualHost på port 80 for <domene>. Denne VHen har en viss DocumentRoot. Klienten legger deretter challenge-teksten in DocumentRoot/.well-known/acme-challenge. ACME-serveren besøker deretter <domene>/.well-known/acme-challenge over http, ser at challengen er riktig, og gir oss et sertifikat.
dns-01
I en dns-01-challenge legger vi en TXT-record i sonefilen for et subdomene av <domene>, f.eks. _acme-challenge.<domene>. ACME-serveren sjekker dette over DNS, og gir oss et sertifikat.
Hvordan utstede et sertifikat
TL;DR: For en vanlig webside på cirkus, bruk:
certbot run -a varnish -i hitch -d <domene>
Velg den første/nyeste kontoen når du blir bedt om å velge.
Sett så opp en redirect i /etc/varnish/default.vcl, slik at forespørsler til http://domene.samfundet.no automagisk blir sendt til https://domene.samfundet.no
(Hint: søk etter c.samfundet.no så skjønner du nok tegninga.)
Når certbot har gjort jobben sin, skal sertifikatet ende opp i /etc/letsencrypt/live/<domene>. Utsteding eller fornying av et enkeltsertifikat med certbot har formen
certbot <kommando> --<plugin> -d <domene>
<kommando>: I certbot skilles det mellom autentisering og installasjon. Førstnevnte er utsteding av et sertifikat fra ACME-serveren, mens sistnevnte er å sette sertifikatet i produksjon. Med mindre du bruker varnish/hitch (som vi gjør på cirkus, se under), er det erfaringsmessig greit å bare utstede det automatisk, og installere det manuelt - certbot har en tendens til å installere sertifikater på en estetisk frastøtende måte.
- For utsteding og installasjon, bruk run her.
- For bare utsteding, dvs. manuell installasjon, bruk certonly.
- Alternativt kan du bruke renew hvis du vil fornye alle utgåtte sertifikater. For å fornye et enkeltsertifikat må du bruke en av de to førstnevnte kommandoene.
<plugin>: certbot håndterer ulike challenger med ulike pluginer.
- For http-01 bruker vi webroot. For at dette skal fungere, må du først sørge for at du har en VirtualHost på <domene>:80, og at <domene>/.well-known/acme-challenge er tilgjengelig over http. For akkurat denne plasseringen vil du altså ikke ha https.
- På cirkus er situasjonen litt spesiell siden all webtrafikk går gjennom varnish, og hitch terminerer all SSL. Derfor brukes heller en varnish-plugin som autentifikator, som vil si at det er varnish som utfører http-01-challengen. Samtidig bruker vi en hitch-plugin for installasjon, siden hitch avhenger av å ha sertifikatet vi mottar i et litt spesielt format (privatnøkkel, offentlig nøkkel og Diffie-Hellmann-parametre i samme fil. Se Varnish.) Vi bytter derfor ut hele –<plugin> med den litt lengre -a varnish -i hitch .
- For å få utstedt sertifikater på en boks hvor det ikke ligger en VirtualHost (f.eks. merkdem), kan det være kjekt å bruke dns-01 challenge. Dette innebærer at vi i DNS (BIND for oss) oppretter en TXT record som svarer på gitt challenge. Dette krever at sonen som <domene> er en del av er dynamisk, noe samfundet.no ikke er. Derfor må vi ha et CNAME videre til en dynamisk sone, slik at certbot kan bruke nsupdate (hooken finnes i /etc/letsencrypt/hooks/nsupdatehook.sh). Når certbot er ferdig, skal sertifikatet ligge i /etc/letsencrypt/live/<domene>, med mindre du har spesifisert noe annet. En typisk fremgangsmåte er:
- Legg til _acme-challenge.<subdomene>.samfundet.no med CNAME til _acme-challenge.<subdomene>.le.samfundet.no i samfundet.no-sonen
- Signer samfundet.no med cd /etc/bind/pz; zonesigner samfundet.no for DNSSEC
- Reload bind med systemctl reload bind9
- Kjør certbot med certbot certonly –manual -d '<subdomene>.samfundet.no' –preferred-challenges dns-01 –server 'https://acme-v02.api.letsencrypt.org/directory' –manual-auth-hook /etc/letsencrypt/hooks/nsauth-hook.sh –manual-cleanup-hook /etc/letsencrypt/hooks/nscleanup-hook.sh
dns-01 kan gjøres fra certbot på både cassarossa og altersex, men siden det er cirkus som er DNS-serveren, må de tre første stegene alltid utføres der. Hvis derimot sertifikatet skal brukes av f.eks. altersex, skal det siste steget utføres på altersex, som bruker nsupdate til å oppdatere den dynamiske sonen le.samfundet.no på cirkus.
Fornying av sertifikater
På de ulike boksene våre har vi cronjobber som fornyer sertifikatene automatisk. Noen ganger vil vi at certbot skal oppføre seg på en bestemt måte ved fornying av bestemte domener.
Med certbot
Fornying for certbot gjøres ganske enkelt i en cronjobb som kjører certbot renew. Domene-spesifikk konfigurasjonen hentes fra renewal-filene i /etc/letsencrypt/renewal, som genereres ved sertifikatutsteding. Hvis man vil kjøre bestemte kommandoer ved fornying, som å flytte sertifikatet til rett plass (default er /etc/letsencrypt/live) og omlaste exim4 ved nytt sertifikat for smtp.samfundet.no, kan man legge inn en renew-hook. For eksempel bruker vi på cassarossa /etc/letsencrypt/hooks/renew-hook.sh, og slenger –renew-hook /etc/letsencrypt/hooks/renew-hook.sh på certbot.
Testing
Når man har fornyet et sertifikat manuelt eller utstedt et nytt, kan det være nyttig å sjekke at det fungerer. Her er SNI ofte veien å gå! Se OpenSSL-noden for tips.
Lokale endringer
Per 2017-01-28 kjøres ikke hitch-installerens deploy_cert under fornying av sertifikater med «certbot renew». Det finnes derfor en lokal endring i /usr/lib/python2.7/dist-packages/certbot/main.py, hvor
le_client.deploy_certificate(domains, lineage.privkey, lineage.cert, lineage.chain, lineage.fullchain)er lagt til for at sertifikatene skal konkateneres til /etc/letsencrypt/live/<domene>/all.pem, siden hitch krever både fullchain og privkey i én fil.
Lenker: Start, avvikuka hvordan utvikle, innsida, hvordan utvikle, itkaclbruk, medlemsdb2, hvordan utvikle, openssl, ufs, hvordan utvikle, utleggsys, wlan
Epost: itk@samfundet.no | Telefon: 992 15 925 | Sist endret: 2022-09-27 08:38 | Revisjon: 20 (historie, blame) | Totalt: 1905 kB | Rediger