Tento príspevok je pokračovaním môjho predchádzajúceho príspevku. Ten demonštroval, ako nastaviť HTTPS pre Nginx získaním certifikátu cez klienta tretej strany zvaného acme.sh. Obsahuje aj základnú teóriu k týmto pojmom. Odporúčam ho prečítať, ak si nie ste istí.
Začnite vytvorením wildcard DNS záznamu typu A zadaním hviezdičky (*) na mieste subdomény. Uvažujme opäť doménu example.com — záznam by mal obsahovať hodnotu *.example.com.
Skúsme wildcard v ALPN režime:
acme.sh --issue --alpn -d "*.example.com"
Skončí sa chybovou správou:
The supported validation types are: dns-01, but you specified: tls-alpn-01
Vieme, že tls-alpn-01 je ALPN režim. Čo znamená režim dns-01?
DNS-01 challenge #
Je tu dôvod, prečo si acme.sh sťažuje na nepodporovaný typ validácie. Typ validácie je v štandarde ACME definovaný ako challenge. V dokumentácii acme.sh sa na to odkazuje ako na mode. Dôvod je, že ALPN (alebo standalone, alebo webroot, alebo dokonca Nginx/Apache) režim funguje tak, že preukazuje kontrolu nad hostom dočasnými zmenami na ňom, ktoré môžu byť zvonku bezpečne overené. Zvonku v tomto scenári znamená zo strany LetsEncrypt. LetsEncrypt tým, že vykoná toto overenie, má dôkaz, že skutočne ovládame doménu, na ktorú je certifikát vydávaný.
DNS-01 challenge to robí trochu inak. Vyžaduje pridanie TXT záznamu k doméne. Počas challenge LetsEncrypt prečíta TXT záznam (ak mal dostatok času na propagáciu) a ak je správny, certifikát je vydaný.
Používanie DNS API môže byť nebezpečné #
Vyššie uvedený krok možno automatizovať, keďže väčšina registrátorov domén dnes poskytuje API prístup na programatickú manipuláciu so záznamami domény na ich menných serveroch. Pred pokračovaním sa uistite, že rozumiete súvisiacim rizikám.
Varovanie: v závislosti od vášho DNS providera môže byť automatizácia obnovy LetsEncrypt cez DNS-01 challenges neuveriteľne nebezpečná, keďže API kľúče musia byť dostupné v plaintexte a väčšina providerov ponúka príliš veľkú kontrolu cez ich API. Kompromitovaný stroj by mohol mať za následok zmenu všetkých host záznamov, alebo (u niektorých providerov) zmenu údajov registranta domény alebo dokonca priamy prevod domény.
Spôsoby, ako toto zmierniť:
- Neukladajte auth token a obnovu spúšťajte manuálne.
- Spustite obnovu na stroji, ktorý nie je na verejnom internete, a certifikáty preneste na server cez SFTP/SCP.
- Spustite inštanciu acme-dns, delegujte na ňu vašu _acme-challenge a automatizujte proces s jej pomocou.
Považujte sa za varovaných a vyhnite sa ponechaniu tohto režimu bez zmierňujúcich opatrení alebo automatizovaného na kriticky dôležitých službách.
Wildcard DNS API režim #
Pre tento príklad použijeme porkbun.com API:
export PORKBUN_API_KEY="..."
export PORKBUN_SECRET_API_KEY="..."
acme.sh --issue --dns dns_porkbun -d "*.example.com"
Ak sa objaví chyba, že hook nie je dostupný (napríklad preto, že nebol zahrnutý v balíčku):
Can not find dns api hook for: dns_porkbun
Skúste stiahnuť požadovaný hook z master vetvy do /root/.acme.sh:
wget -P /root/.acme.sh/ https://raw.githubusercontent.com/acmesh-official/acme.sh/master/dnsapi/dns_porkbun.sh
Tip: API kľúče sú uložené v .acme.sh/account.conf, ak by ste ich
potrebovali vymazať. Ako bezpečnejšie možnosti zvážte aj zrušenie platnosti
kľúčov a zakázanie API prístupu, keďže po ich odhalení je len malá záruka,
že ich vymazanie problém vyrieši.
Zostatok krokov nastavenia je rovnaký ako nastavenie uvedené v príspevku na začiatku.
Toto je 42. príspevok #100daystooffload.
Odkazy #
- https://community.letsencrypt.org/t/wildcard-domain-step-by-step/58250/5
- https://github.com/acmesh-official/acme.sh/issues/1571#issuecomment-384999814
- https://github.com/acmesh-official/acme.sh/wiki/dnsapi#130-using-the-porkbun-api
- https://kb.porkbun.com/article/94-what-is-a-wildcard-dns-record
- https://kb.virtubox.net/knowledgebase/how-to-issue-wildcard-ssl-certificate-with-acme-sh-nginx/
- https://letsencrypt.org/docs/challenge-types/#tls-alpn-01