HTTPS med wildcard-cert via acme.sh och Let's Encrypt
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
- HTTP-01 kan inte validera ett wildcard — det måste vara DNS-01.
- Testa mot staging-utfärdaren; produktion har snäva rate limits.
- Håll API-credentialen enligt minsta behörighet och borta från historiken.
acme.shhamnar i~/.acme.shoch ligger inte påPATH— lägg till den, eller anropa med full sökväg.--reloadcmdmåste faktiskt ladda om servern, annars serveras det gamla certifikatet tills nästa omstart.
Se videon: HTTPS med wildcard-cert via acme.sh och Let’s Encrypt.