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.

Vi bruker gjerne http-01 for nettsider, og dns-01 for ikke-nettsider.

BoksChallenge-protokollPlugin
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

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.

<plugin>: certbot håndterer ulike challenger med ulike pluginer.

  1. Legg til _acme-challenge.<subdomene>.samfundet.no med CNAME til _acme-challenge.<subdomene>.le.samfundet.no i samfundet.no-sonen
  2. Signer samfundet.no med cd /etc/bind/pz; zonesigner samfundet.no for DNSSEC
  3. Reload bind med systemctl reload bind9
  4. 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, openssl, wlan

Mail: itk@samfundet.no | Telefon: 992 15 925 | Sist endret: 2018-09-09 00:30 | Revisjon: 16 (historie, blame) | Totalt: 1479 kB | Rediger