Pokud potřebujeme na našem Raspberry Pi používat šifrovanou komunikaci (například u webového serveru) je vhodné použít zabezpečenou komunikaci mezi serverem a klientem (webovým prohlížečem) -> a to celé světe div se zadarmo! Tento článek vychází z potřeby zabezpečit šifrovaně komunikaci pro zavlažování mé zahrady se systémem OSPy.
Co je šifrovaná komunikace? https://cs.wikipedia.org/wiki/Transport_Layer_Security
Let's Encrypt je certifikační autorita. Pomocí automatizovaného procesu je vše navrženého tak, aby se odstranil složitý proces manuální tvorby, ověřování, podepisování, instalace a obnovování certifikátu. Zdarma poskytuje doménově ověřené certifikáty. https://letsencrypt.org/
Co budeme potřebovat?
- musíme vlastnit doménu (například pepa.melemaso.cz) -> doménu získáme například zde: https://www.wedos.cz/
- zařízení na kterém chceme provozovat zabezpečené spojení (Linux v Raspberry Pi xx)
- ideálně veřejnou IP adresu k routeru (nebo se propojit ze zařízení přes další služby jako je DDNS, ale jak toto provést není součástí tohoto článku)
- přístup k našemu routeru (pro směrování portů)
Postup instalace a nastavení pro certifikační autoritu (Let’s Encrypt)
- port 80 a 443 nesmí být na našem serveru používán jinou službou (OSPy - zalévač běží ve výchozím stavu na portu 8080 -> je to tedy v pořádku)
- musíme mít u poskytovatele naší zakoupené domény nastaveno DNS směrování na veřejnou IP adresu našeho routeru (například: pepa.melemaso.cz -> směruje na 10.11.12.13. Pokud do prohlížeče zadáme adresu: https://pepa.melemaso.cz tak bude prohlížeč směrován na IP adresu routeru 10.11.12.13:443)
Krok 1 - Instalace Certbot
Přihlásíme se do Raspberry Pi přes SSH (například pomocí putty), provedeme aktualizaci systému a instalaci klienta Certbot.
- sudo apt-get update
- sudo apt-get upgrade
- sudo apt-get install certbot
- sudo reboot
Krok 2 - Spuštění certifikátu
Certbot musí odpovědět na kryptografickou výzvu vydanou přes API serverů Let's Encrypt API, abychom dokázali, že ovládáme naši doménu. K dosažení tohoto cíle se používají porty 80 (HTTP) nebo 443 (HTTPS).
Nyní můžeme spustit Certbot, abychom získali náš certifikát.
Volbou --standalone řekneme Certbotu, aby zvládl komunikaci pomocí vlastního vestavěného webového serveru. Volba --preferred-challenges dává Certbotu pokyn, aby používal port 80 nebo port 443. Pokud používáme port 80 --preferred-challenges http. Pro port 443 by to bylo --preferred-challenges tls-sni. Nakonec parametr -d se používá k určení názvu domény, pro kterou požadujete certifikát. Můžete přidat více možností -d a tím pokrýt více domén v jednom certifikátu.
- sudo certbot certonly --standalone --preferred-challenges http -d pepa.melemaso.cz
Při spuštění příkazu budeme vyzváni k zadání e-mailové adresy a souhlasu s podmínkami služby. Poté by se nám měla zobrazit zpráva informující o tom, že proces byl úspěšný a kde jsou naše certifikáty uloženy:
pi@ospy:~ $ sudo certbot certonly --standalone --preferred-challenges http -d pepa.melemaso.cz
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for pepa.melemaso.cz
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/pepa.melemaso.cz/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/pepa.melemaso.cz/privkey.pem
Your cert will expire on 2020-01-13. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Ruční generování certifikátů (z nějakého důvodu, například testování).
- sudo certbot renew
Krok 3 - Konfigurace naší aplikace
Konfigurace naší aplikace pro SSL je nad rámec tohoto článku, protože každá aplikace má odlišné požadavky a možnosti konfigurace, ale podívejme se, co pro nás Certbot stáhl. Certifikační autorita pomocí Certbotu uloží klíče do složky v mém příkladu etc/letsencrypt/live/pepa.melemaso.cz
Tato složka obsahuje klíče a certifikáty.
- privkey.pem: soukromý klíč pro náš certifikát
- fullchain.pem: soubor certifikátů používaný na většině serverů
- chain.pem: používá se pro OCSP v Nginx >= 1.3.7
- cert.pem: neměl by být používán
VAROVÁNÍ: NEMĚNÍME TYTO SOUBORY! Certbot očekává, že tyto soubory zůstanou v tomto umístění v pořádku a beze změn uživatelem.
Pro použití v systému zalévače OSPy (jeho webový server) je fullchain.pem jako "crt" soubor a privkey.pem je jako "key" soubor. V poslední verzi zálevače OSPy (od verze: 2.5.669 2019-11-07) je již cesta k certifikátům nastavena v závislosti na nastavení doménového jména (doménové jméno nastavíme v záložce "nastavení" systému OSPy).
Krok 4 - Zpracování automatických obnov certifikátů
Certifikáty jsou platné pouze po dobu devadesáti dnů. To má podnítit uživatele k automatizaci procesu obnovy certifikátů. Certbot se o to postará sám přidáním obnovovacího skriptu do souboru /etc/cron.d. Tento skript se spouští dvakrát denně a obnoví všechny certifikáty, které uplynou do třiceti dnů před vypršením platnosti.
Po obnovení certifikátů je nutné náš webový server restartovat, aby se načetly certifikáty nové. Buď provedeme restart serveru (služby) ručně (sudo service ospy restart), nebo využijeme možnosti restartovat server automaticky pomocí Certbotu. Chceme-li přidat soubor renew_hook pro automatizaci, aktualizujeme konfigurační soubor pro obnovu Certbotu. Certbot si pamatuje všechny podrobnosti o tom, jak jsme poprvé získali certifikát a po obnovení bude se stejnými možnostmi pracovat. Stačí přidat do souboru conf u certifikátu co se má provést.
- sudo nano /etc/letsencrypt/renewal/pepa.melemaso.cz.conf
Přidáme do souboru conf:
- renew_hook = systemctl restart ospy
Uložíme a zavřete soubor conf a poté spustíme běh Certbotu "nanečisto" pro ujištění se, zda je syntaxe v pořádku:
- sudo certbot renew --dry-run
Pokud nevidíme žádné chyby je všechno připraveno.
IPv4 versus IPv6
Můj router není nastaven pro IPv6 (směrování) provoz a při generovaní certifikátu pomocí Certbotu se mi nedařilo certifikát na svém Raspberry Pi vygenerovat. Zjistil jsem, že Certbot preferuje komunikaci přes IPv6. Řešením bylo v mém případě zakázat v Raspberry Pi použití IPv6 a ponechat pouze IPv4. Následně vše proběhlo v pořádku.
- sudo nano /etc/modprobe.d/ipv6.conf
# Don't load ipv6 by default
alias net-pf-10 off
#alias ipv6 off
# added to disable ipv6
options ipv6 disable_ipv6=1
# added to prevent ipv6 driver from loading
blacklist ipv6