Anders Tall

HTTPS med wildcard-cert via acme.sh och Let's Encrypt

3 min läsning

Ett certifikat för varje underdomän du någonsin lägger till: blog., tube., status. — alla, från en enda utfärdning och en enda förnyelse. Det är skillnaden mellan ett certifikat att hålla reda på och ett per tjänst att glömma bort.

Det här är beskrivningen för videon: vad DNS-01 är, varför ett wildcard kräver det, och exakt hur flödet ser ut med acme.sh och Let’s Encrypt.

Vad detta ger oss

Ett giltigt, auto-förnyande certifikat för tall.nu + *.tall.nu, bevisat med openssl:

openssl x509 -in /etc/ssl/tall.nu/full.pem -noout -dates -subject -ext subjectAltName
# ...
# X509v3 Subject Alternative Name:
#     DNS:*.tall.nu, DNS:tall.nu

Varför DNS-01

Wildcard-certifikat kräver DNS-01-utmaningen. HTTP-01 bevisar att du kontrollerar en specifik värd genom att lägga en fil på den — det kan aldrig bevisa att du kontrollerar * (alla värdar samtidigt). DNS-01 lägger i stället en TXT-post i zonen, och en post i zonen täcker hela domänen.

Notera att wildcards bara är ett steg djupa: *.tall.nu täcker blog.tall.nu, men inte x.blog.tall.nu.

Flödet, från början till slut

Mot Let’s Encrypts staging-utfärdare medan du får ordning på det (staging har egna, mycket högre rate limits):

export PATH="$HOME/.acme.sh:$PATH"
curl https://get.acme.sh | sh -s email=du@example.com
install -D -m 0644 dns_nmu.sh ~/.acme.sh/dnsapi/dns_nmu.sh
export NMU_API_TOKEN="$(cat /root/.nmu_token)"     # aldrig i bild
acme.sh --issue --dns dns_nmu -d tall.nu -d '*.tall.nu' --staging
mkdir -p /etc/ssl/tall.nu
acme.sh --install-cert -d tall.nu \
  --key-file /etc/ssl/tall.nu/priv.key \
  --fullchain-file /etc/ssl/tall.nu/full.pem \
  --reloadcmd "systemctl reload apache2"

acme.sh läser provider-credentialen från miljön första gången och sparar den i ~/.acme.sh/account.conf, så förnyelsen sköter sig själv. Klistra inte in token i skalhistoriken och hårdkoda den inte i pluginet — läs den från en fil (som ovan), och håll den borta från allt du spelar in eller checkar in.

Wildcard-fällan: två TXT-värden, ett namn

Det här är delen som lurar folk. Både tall.nu och *.tall.nu publicerar sin utmaning på samma namn — _acme-challenge.tall.nu — så två TXT-värden måste finnas samtidigt under valideringen.

Om providerns API ersätter alla poster vid varje skrivning (många gör det) kommer en naiv add-hook att skriva över det första värdet med det andra, och valideringen hänger för evigt och upprepar Checking tall.nu for _acme-challenge.tall.nu. I vår dns_nmu-hook betyder det att vi håller värdena i en liten state-fil och skickar hela listan varje gång.

Förnyelsen är hela poängen

Let’s Encrypt-certifikat gäller i 90 dagar. acme.sh installerar ett cron-jobb när det installerar sig, och --install-cert --reloadcmd gör att webbservern plockar upp det nya certifikatet efter varje förnyelse:

35 5,11,17,23 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

Ett certifikat du måste förnya för hand är ett certifikat som en dag går ut.

Fällor

Se videon: HTTPS med wildcard-cert via acme.sh och Let’s Encrypt.

#wildcard certificate #letsencrypt #acme.sh #dns-01 #https #tls #self-hosting #linux #terminal