Najpoužívanejšie webové prehliadače už niekoľko rokov nútia užívateľov aby pristupovali na weby šifrovaným spôsobom. To znamená, že ak na webovom servery nie je použitý dôveryhodný SSL certifikát (HTTPS), tak webový prehliadač označí takýto web za nebezpečný a klientovi ponúkne možnosť aby na ten web vôbec nešiel, príp. ak webu dôveruje, tak naň môže vstúpiť.
Obsah
- Úvod do problematiky CA
- mkcert
- Rušíme pôvodné certifikáty
- Lokálny A záznam v DNS
- Web prehliadač musí dôverovať CA
- Záver
- Použitá literatúra
Úvod do problematiky CA
Operačné systémy, resp. webové prehliadače už po vybalení obsahujú zoznamy certifikačných autorít (CA), ktorým majú dôverovať. Najznámejšie CA, ktorým webové prehliadače dôverujú sú napr. DigiCert, RapidSSL, Verysign, Godaddy príp Let’s Encrypt, ktorá ako jedna z mála CA vydáva SSL certifikáty zdarma. Dnes si môže CA za pomoci OpenSSL vytvoriť aj bežný smrteľník, ktorou potom môže podpisovať certifikáty. Takýmto certifikátom však žiadny webový prehliadač nebude dôverovať. Aj keď certifikát bude platný a komunikácia medzi serverom a klientom bude šifrovaná, tak webový prehliadač označí web za nebezpečný.
Už v minulosti som na svojom blogu písal, že používam DNS službu od freenom a že po niekoľkých bezproblémových rokoch to ide so spoločnosťou dolu vodou. Začiatkom roku 2024 boli zrušené aj TLD tk. Na tejto TLD som používal ešte 2 webové projekty a certifikát som mal vystavený od spoločnosti Let’s Encrypt. Táto spoločnosť vydáva certifikáty len pre verejné domény, ktoré je možne overiť pomocou viacerých výziev. Vzhľadom k tomu, že tieto domény už verejne nie sú a ani nebudú, tak Let’s Encrypt už certifikát na tie domény nemôže vydať.
Rozhodol som sa, že domény si ponechám a budú fungovať len v lokálnej sieti (LAN). Avšak keď chceme aby boli aj v LAN domény šifrované a bez nejakých zbytočných upozornení v prehliadačoch, tak jednou z možností je vytvoriť si vlastnú CA. Webovým prehliadačom musíme potom povedať aby akceptovali túto CA za dôveryhodnú. Vytvorenie CA za pomoci nástrojov na to určených nie je nič zložité. Ja som si vybral nástroj zvaný mkcert.
Tento nástroj slúži hlavne pre vývojárov, ktorí pracujú väčšinou na localhoste a potrebujú riešiť SSL certifikáty lokálne. Aby im na localhoste, alebo akejkoľvek lokálnej doméne (úprava /etc/hosts) fungoval dôveryhodný SSL certifikát, stačí im použiť 2 jednoduché príkazy. Prvým príkazom sa vytvorí CA a automaticky sa pridá do systému. Druhý príkaz vygeneruje certifikát pre doménu, ktorú mu zadáme ako parameter. Ja chcem mkcert využiť na niečo podobné, avšak nepotrebujem riešiť localhost, ale počítače v LAN sieti.
mkcert
V linuxových distribúciach založených na Debiane môžeme použiť na inštaláciu baličkovací nástroj APT. Ja budem vytvárať CA na servery, kde mám uložené weby. Najprv sa cez SSH prihlásim na server, aktualizujeme zdroje a nainštalujem mkcert.
sudo apt update
sudo apt install mkcert
Teraz vytvoríme CA
mkcert -install
Výstup príkazu na vytvorenie CA
Created a new local CA 💥
The local CA is now installed in the system trust store! ⚡️
Pomocou príkazu skontrolujeme kde sa nám uložili certifikáty
mkcert -CAROOT
Výstup
/home/user/.local/share/mkcert/
Adresár bude obsahovať 2 súbory rootCA-key.pem a rootCA.pem. Taktiež skontrolujeme či sa CA certifikát pridal do systému
ls /usr/local/share/ca-certificates/
Teraz môžeme generovať certifikáty pre konkrétne domény (napr. www.example.com).
mkcert www.example.com
Výstup príkazu na vytvorenie cert. pre example.com
Created a new certificate valid for the following names 📜
- "www.example.com"
The certificate is at "./www.example.com.pem" and the key at "./www.example.com-key.pem" ✅
It will expire on 4 July 2026 🗓
Skutočne v tomto prípade bude vygenerovaný certifikát pre example.com s platnosťou 821 dni. Certifikáty sa vygenerovali v domovskom adresári
www.example.com-key.pem
www.example.com.pem
Rušíme pôvodné certifikáty
Ja používam reverzný proxy server nginx a ako CA Let’s Encrypt. Za pomoci nástroja certbot sa certifikáty obnovujú automaticky. Certbot si aj sám upraví konfiguráciu nginx (resp. automaticky pridá do konfigurácie cesty k certifikátom). Aby sa certbot zbytočne nesnažil obnovovať certifikáty, ktoré už obnoviť nemôže, odporúča sa tieto certifikáty zo systému odstrániť. Najprv si vylistujeme certifikáty
sudo certbot certificates
Výpis by mohol vyzerať následovne (na ukážku sen dávam jeden certifikát).
Found the following certs:
Certificate Name: example.com
Serial Number: 3c78f42871f8d54f7ac5478045ea9398bfd
Key Type: ECDSA
Domains: example.com
Expiry Date: 2024-06-12 22:57:48+00:00 (VALID: 68 days)
Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem
Zistíme, že certifikát je pod menom example.com. Čiže ho môžeme odstrániť a samozrejme odstraňujeme aj symbolicky link, odkiaľ nginx číta konfiguráciu.
sudo certbot delete --cert-name example.com
sudo unlink /etc/nginx/sites-enabled/www.example.com
sudo nginx -t && sudo systemctl reload nginx
Teraz môžeme skúsiť test obnovy certifikátov na sucho
sudo certbot renew --dry-run
V závislosti od toho koľko certifikátov (doménových mien) používame, tak obnova na sucho môže trvať o niečo dlhšie. Obnova by mala skončiť bez chyby.
Lokálny A záznam v DNS
V lokálnej sieti používam lokálny DNS (unbound na pfSense), takže A záznam som si musel pridať k doméne example.com. Ak nevieme ako vytvoriť A záznam na pfSense, tak prejdime sem.
Web prehliadač musí dôverovať CA
Ak by sme teraz v LAN sieti na akomkoľvek PC spustili webový prehliadač a ako url by sme použili example.com, tak stále by bola naša doména označená za nebezpečnú. My potrebujeme CA preniesť na každý OS, resp. webový prehliadač v LAN sieti, kde chceme doménu používať. Ak by sme chceli koreňovú CA riešiť priamo vo webových prehliadačoch, tak musíme použiť tento cert
/home/user/.local/share/mkcert/rootCA.pem
Tu sú príklady pre rôzne prehliadače.
Postupy sa môžu trocha líšiť. Napr. ak pridáme v MS Widows certifikát do Google chromu, tak s ním bude pracovať aj Microsoft Edge (tam ho už pridávať nemusíme). Alebo na Androide to môže závisieť od konkrétnej verzie Androidu.
Ja pracujem väčšinou na desktope, kde mám linux a certifikát som pridával do systému takto.
sudo apt update
sudo apt install libnss3-tools
sudo apt install mkcert
Vytvoríme si adresár
mkdir /home/user/.local/share/mkcert
nano /home/user/.local/share/mkcert/rootCA.pem
Do súboru rootCA.pem na desktope, nakopírujeme obsah súboru zo servera, ktorý je tiež uložený v podobnom súbore na servery. Obsah si zobrazíme na servery príkazom (user nahradíme skutočným menom užívateľa).
cat /home/user/.local/share/mkcert/rootCA.pem
mkcert -install
The local CA is now installed in the system trust store! ⚡️
The local CA is now installed in the Firefox and/or Chrome/Chromium trust store (requires browser restart)! 🦊
Certifikát by sa mal nainštalovať do
/usr/local/share/ca-certificates/
Teraz nám stačí reštartovať webový prehliadač, ktorý by sa už nemal sťažovať, že webová stránka je nebezpečná. Toto bohužiaľ musíme spraviť na každom PC, kde chceme zabezpečený web používať.
Záver
mkcert bol vytvorený aby zjednodušoval vývojárom prácu na localhoste. Mne zase dobre poslúži v lokálnej sieti. Je to však prácnejšie, pretože do každého zariadenia, kde chceme s https pracovať, musíme ručne doinštalovať certifikát CA. Teraz ma napadá myšlienka, že takáto CA môže byť použitá aj pri napadnutí nič netušiacých užívateľov. Stačí do systému nahrať našu CA a DNS servery nasmerovať tam kde chceme.
