Lokálna certifikačná autorita s mkcert

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

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.

Použitá literatúra

Leave a Reply

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *