Moderný internet je plný šifrovania. V mnohých ohľadoch je šifrovanie stále
voliteľné, hoci nešifrovaná komunikácia akéhokoľvek druhu je každým dňom
vzácnejšia. Existujú faktory, ktoré prispievajú k tomuto trendu. Ako
konkrétny príklad, niektoré domény najvyššej úrovne, ako .app alebo
.dev, majú v mainstreamových prehliadačoch napevno zakódovaný vynútený
režim HTTPS pre tieto vybrané TLD.
Aby HTTPS fungovalo, prehliadač a webserver musia najprv vykonať výmenu kľúčov. Táto výmena sa označuje ako TLS handshake. Po úspešnom handshake môžu prehliadač a webserver komunikovať bezpečne, čo znamená, že ktokoľvek, kto odpočúva komunikáciu, vidí len nezmysel, pokiaľ komunikáciu nedokáže skutočne dešifrovať.
Aby webserver mohol vykonať TLS handshake, potrebuje certifikát, ktorý sa používa na šifrovanie verejným kľúčom. Certifikát sa tradične kupoval od Certifikačnej autority (CA), kým nezisková CA s názvom LetsEncrypt nezačala poskytovať certifikáty zadarmo, takže môžeme mať všetci pekné veci (bezpečnú komunikáciu s webserverom).
ACME a Certbot #
ACME je skratka pre Automated Certificate Management Environment a poskytuje protokol umožňujúci akémukoľvek webserveru sediaciemu pod skutočným doménovým menom získať certifikát od LetsEncrypt zadarmo.
Oficiálny klient implementujúci protokol ACME sa volá Certbot a je napísaný v Pythone. Je to výkonný klient, ale má tiež svoje problémy. Pretože je to akýsi švajčiarsky nôž, snaží sa zvládnuť mnoho úloh. Svojou povahou je trochu ťažší na závislostiach. Konkrétne sa mi nepáči, že predvolene pridáva riadky do konfiguračných súborov Nginx. Ďalší problém som mal na Ubuntu stroji. Keď vyšiel 20.04, repozitáre boli pomalšie s aktualizáciou a musel som manuálne záplatovať kód certbotu, čo nie je príjemná skúsenosť. To je tiež dôvod, prečo experimentujem s Arch ako serverom.
Certbot nie je jediný dostupný klient hovoriaci protokolom ACME. Protokol ACME je dostupný ako RFC8555 a certifikát od LetsEncrypt môže ktokoľvek získať dokonca manuálne podľa neho. Existuje tiež mnoho klientov tretích strán, ktoré tento proces automatizujú.
Vstupuje acme.sh #
Jedným z takýchto klientov je acme.sh a ako napovedá jeho názov, je to Shell skript s (takmer) žiadnymi závislosťami. Táto skutočnosť zmierňuje problém pomalej aktualizácie repozitárov takmer úplne, pretože vždy stačí použiť git na získanie najnovšej verzie, bez ohľadu na to, kde sú repozitáre hostiteľského operačného systému. Stránka Acme.sh uvádza:
Je to pravdepodobne najjednoduchší a najinteligentnejší shell skript na automatické vydávanie a obnovu bezplatných certifikátov od Let’s Encrypt.
Pozrime sa, či toto tvrdenie obstojí.
Nastavenie #
Začnite nastavením DNS záznamu typu A alebo CNAME pre sub.example.com
smerujúceho na verejnú IP adresu hostiteľa, kde budú tieto kroky
aplikované. DNS záznamy je možné nastaviť kedykoľvek, ale môže trvať nejaký
čas, kým nameservery šíria zmeny, preto je lepšie to urobiť ako prvé.
Tento návod predpokladá stať sa superužívateľom:
su -
Nainštalujte acme.sh a Nginx, prípadne nginx-mainline:
pacman -S --needed acme.sh nginx
Uistite sa, že na porte 443 používanom pre HTTPS nič nepočúva:
ss -tuna | grep :443
Ak tam niečo beží, zastavte to.
Vydanie certifikátu #
Ďalší krok využíva Application-Layer Protocol Negotiation (ALPN), čo je
počiatočná časť TLS handshake spomínaná vyššie. Acme.sh je schopný vydať
certifikát pomocou ALPN režimu. Certifikáty sa inštalujú do
/root/.acme.sh/sub.example.com/:
acme.sh --issue --alpn -d sub.example.com
Teraz vyberte umiestnenie, kde uložíte certifikáty, príklady:
/etc/ssl/certspoužíva OpenSSL/etc/letsencrypt/livepoužíva Certbot/etc/nginx/sslpreferujú niektorí používatelia
Ak certifikáty používa výlučne Nginx, /etc/nginx/ssl je dobrá voľba:
mkdir /etc/nginx/ssl
Je dôležité nastaviť správne oprávnenia pre túto zložku na ochranu súkromného kľúča:
chmod 700 /etc/nginx/ssl
Zložka musí byť vo vlastníctve používateľa root.
Konfigurácia Nginx #
Teraz skopírujte vygenerované certifikáty tam, venujte pozornosť
reloadcmd:
acme.sh --install-cert -d sub.example.com \
--key-file '/etc/nginx/ssl/sub.example.com.key' \
--fullchain-file '/etc/nginx/ssl/sub.example.com.cer' \
--reloadcmd "systemctl force-reload nginx"
Dôležité: skontrolujte oprávnenia. Zložka /etc/nginx/ssl by mala mať
700, .cer súbory by mali mať 644 a .key súbor by mal mať 600. Všetko by
malo byť vo vlastníctve roota. Upozorňujeme, že vlastníctvo a oprávnenia sa
zachovávajú automaticky pri obnove certifikátov.
find /etc/nginx/ssl -printf "%m %f\n"
700 ssl
600 sub.example.com.key
644 sub.example.com.cer
Pridajte relevantné údaje do bloku server v konfigurácii Nginx. Nie
všetky konfiguračné direktívy sú ponúknuté v príklade nižšie, len tie
najrelevantnejšie. Zvážte konzultáciu
dokumentácie
Nginx o HTTPS.
server {
listen 443 ssl;
server_name sub.example.com;
ssl_certificate /etc/nginx/ssl/sub.example.com.cer;
ssl_certificate_key /etc/nginx/ssl/sub.example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
}
Nakoniec spustite a povoľte službu Nginx:
systemctl enable nginx.service --now
Teraz otvorte stránku v prehliadači a skontrolujte, či HTTPS funguje.
Poznámka: keď HTTPS cez Nginx funguje, zvážte prepnutie na získanie certifikátu cez Nginx režim, pretože obnova certifikátu cez ALPN už nebude fungovať, keďže Nginx už počúva na porte 433. Dôvod, prečo bol ALPN použitý na začiatku, je, že nevyžaduje žiadne závislostiach na rozdiel od standalone režimu vyžadujúceho socat. Druhý dôvod je, že Nginx validačný režim môže na začiatku vyžadovať funkčnú konfiguráciu Nginx, takže je lepšie začať bezpečne.
acme.sh --issue --nginx -d sub.example.com
Toto je 41. príspevok série #100daystooffload.
Odkazy #
- https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation
- https://github.com/acmesh-official/acme.sh
- https://serverfault.com/a/216480/505241
- https://serverfault.com/a/259307/505241
- https://stackoverflow.com/a/1796163/1972509
- https://wiki.archlinux.org/index.php/Acme.sh
- https://www.howtoforge.com/getting-started-with-acmesh-lets-encrypt-client/