Publikoval Michal Kočí dňa 7.1.2016 o 19:16 v kategórii Node.js
V máji som tu popisoval, ako získať SSL certifikát zadarmo cez StartSSL. Odvtedy sa situácia ešte zlepšila a už niekoľko týždňov sa dá SSL získať automatizovane a ešte ľahšie cez Let's Encrypt. Dnes sa pozrieme ako na to.
Let's Encrypt je nová certifikačná autorita, ktorá o tvrdí že je zadarmo, automatizovaná a otvorená. Stále je síce "len" vo verejnej bete, ale to vás určite neodradí, najmä keď za ňou stoja sponzori ako Mozilla, cisco či Facebook.
Najväčší rozdiel oproti bežným certifikačným autoritám je, že proces získania certifikátu je plne automatizovaný. Z terminálu (príkazového riadku) spustíte potrebný príkaz, ten sa spojí s certifikačnou autoritou, overí potrebné veci a ak všetko sedí, vygeneruje a uloží vám na disk certifikát. Ten následne použijete v konfigurácii vášho webového servera resp. v reverznej proxy (nginx).
Celý proces necháte bežať na vašom servery, čo vám zabezpečí dve podmienky úspešného overenia:
Ja celý postup ukážem pre scenár, kedy je web napísany v node.js, pred ním stojí reverzná proxy (nginx) a celé to beží na Raspberry PI na distribúcii Raspbian.
Nástroj od Let's Encrypt, ktorý sa asi neprekvapivo volá letsencrypt
, je dostupný tu na GitHube a preto si ho najskôr lokálne naklonujte. Tento príkaz spustite v adresári, kde si ukladáte git veci (napríklad ~/dev/git
)
git clone https://github.com/letsencrypt/letsencrypt
Nástroj letsencrypt
obsahuje niekoľko pluginov, ich celý výčet nájdete v jeho dokumentácii, ktorú verme ešte trochu učešú, lebo niektoré informácie sa v nej veľmi obtiažne dohľadávajú. Ktorý plugin použijete závisí od vášho scenára.
V našom scenári použijeme plugin Webroot. Ten sa hodí v prípade, že máte bežiaci web server a nechcete aby bol tento počas získavania certifikátu zastavený.
Nástroj v tomto prípade potrebuje od vás vedieť najmä doménu, pre ktorý certifikát požadujete, ale tiež adresár, v ktorom sa nachádza vaša aplikácia. Pri node.js webe je to adresár, ktorý poskytuje statické súbory v roote webu.
Ak napríklad váš web máte na serveri v adresári /var/www/myawesomeweb/
a vo vašom node.js webe využívajúcom Express zapojený middleware static
, napríklad takto:
app.use(express.static('public'));Potom adresár, kde chcete aby nástroj ukladal súbory, ktoré použije na overenie bude
/var/www/myawesomeweb/public/
.
Okrem týchto dvoch údajov musíte uviesť pri generovaní váš e-mail a ideálne aj súhlas s Terms & Conditions. Celý príkaz (vrátane prepnutia sa do adresára) tak môže vyzerať nasledovne:
cd letsencrypt ./letsencrypt-auto certonly --webroot --email me@myawesomeweb.com --agree-tos -w /var/www/myawesomeweb/public/ -d www.myawesomeweb.comNahradiť v ňom samozrejme musíte adresár (parameter
-w
), email (parameter --email
) a doménu (parameter -d
)
Ak bolo spustenie nástroja úspešné, vygenerovali sa vám certifikáty a uložili sa vám do adresára /etc/letsencrypt/live/www.myawesomeweb.com/
.
Ale pozor, ich platnosť je nastavená na 90 dní.
Málo? Dosť? Podľa mňa dosť. Tým, že je celý proces plne automatizovaný, stačí vám raz za 90 dní opakovane spustiť ten istý príkaz a vygenerujú a stiahnu sa vám nové, zase 90 dní platné certifikáty.
Ak bežíte na linuxovej distribúcii, ako predpokladá tento náš scenár, potom stačí použiť cron
. Ak by ste si chceli nastaviť generovanie vždy prvého v mesiaci, o druhej hodine rannej, spustite si editáciu cron tabuľky:
crontab -e
Doplňte riadok:
0 2 1 */2 * /home/user/dev/git/letsencrypt/letsencrypt-auto certonly --webroot --email me@myawesomeweb.com --agree-tos -w /var/www/myawesomeweb/public/ -d www.myawesomeweb.com
A zmeny uložte. Samozrejme, zase platí upravte si patrične parametre ako aj cestu k nástroju letsencrypt
.
Pokiaľ chcete spúšťať úlohu v iných intervaloch, len zmeňte definíciu úlohy. Ak neviete ako na to, existuje parádny nástroj crontab.guru, ktorý vám s tým pomôže.
Posledné čo musíte spraviť a to práve raz, keď budete mať certifikáty úspešne uložené na disku je v nginx nakonfigurovať SSL pre váš web.
Ak nižšie uvedenému vôbec nerozumiete, možno vám pomôžu moje články Raspberry Pi a prvá Node.js aplikácia a Node.js, Raspberry Pi a nginx - viac webov na jednom porte.
Čo takto sa rýchlo a ľahko naučiť programovať webové aplikácie v Javascripte? Bežiace na Node.js? Zaujímavé? Jednoduché! Rád vás to naučím na mojom kurze Node.js - serverové aplikácie v Javascripte.
V sites-available
si dajte editovať konfiguračný súbor vášho webu a pridajte do neho sekciu, ktorá bude vyzerať takto nejak:
server { listen 443; server_name www.myawesomeweb.com; access_log /var/log/nginx/myawesomeweb.log;
ssl on; ssl_certificate /etc/letsencrypt/live/www.myawesomeweb.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.myawesomeweb.com/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_dhparam /etc/nginx/conf.d/dhparam.pem;
location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarder-Proto $scheme; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_pass http://127.0.0.1:8001; proxy_redirect off; } }
Prvá časť konfigurácie definuje port na ktorom počúvate (443), doménu a log súbor. Druhá časť konfigurácie zapína SSL, definuje kde sa nachádzajú certifikáty.
V druhej časti máte navyše konfiguráciu SSL tak, aby bola bezpečná a v zmysle best practices. Môžete si ju upraviť podľa svojich potrieb (inšpirujte sa tu, nájdete tu aj ako vygenerovať dhparam.pem
) a potom otestovať vaše SSL nastavenia tu.
No a v tretej časti nájdete nastavenia proxy, smerovania na váš web, ktorý vám beží ako node.js, v tomto prípade na porte 8001.
Pokiaľ už na HTTP web prevádzkovať nechcete, nezabudnite si do konfigurácie pridať aj presmerovanie na HTTPS:
server { listen 80; server_name www.myawesomeweb.com; return 301 https://www.myawesomeweb.com$request_uri; }
Snáď to na prvý pohľad nevyzerá moc komplikovane, ale verím, že nie. A ak aj áno, naozaj to nie je komplikované. Stačí si to celé raz nakonfigurovať a potom na to viac menej s kľudom zabudnúť.
Takže nezabudnite, na váš ďalší web už rovno na začiatku dajte SSL, je to zadarmo a dramaticky to zvyšuje bezpečnosť prenášaných dát, čo sa vám hodí na každom webe.
Ak nechceš premeškať príspevky ako je tento, sleduj ma na Twitteri, alebo ak máš RSS čítačku, môžeš sledovať môj RSS kanál.