Ako získať SSL certifikát zadarmo cez Let's Encrypt pre váš node.js web

Publikoval Michal Kočí dňa 07.01.2016 o 18: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.

Všetko ide plne automatizovane

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:

  • žiadosť pôjde zo servera, na ktorom bude certifikát použitý
  • nástroj si vie do vášho webu pridať súbor, cez ktorý si overí, že doménu vlastníte

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.

Stiahnutie nástroja

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

Spustenie nástroja

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.com
Nahradiť v ňom samozrejme musíte adresár (parameter -w), email (parameter --email) a doménu (parameter -d)

Vygenerované certifikáty

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.

Automatická aktualizácia certifikátov

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.

Konfigurácia nginx

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;
}

Jednoduchšie nez to vyzerá

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.

Mohlo by ťa tiež zaujímať

Páčil sa ti príspevok?

Zdieľaj príspevok alebo si ho odlož na neskôr

Sleduj ma

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.

Komentáre

Piotr dňa 15.03.2016 o 16:39 - Prečo nie musite použiť https v Node.js?

Dakujem za tento príspevok, veľa mi pomohol. Mám jednu otazku: nginx stačí? Netreba použiť aj https v Node.js? V internete možna najsť mnoho príspevkov, kde použivaju aj ngninx proxy, aj https module v Node.js, prečo? Zdravím z Poľska :)

Mifko dňa 18.03.2016 o 18:52 - re: Prečo nie musite použiť https v Node.js?

Dobrý deň, Piotr. Nginx stačí, každý request od užívateľov ide na neho, takže ide cez HTTPS. To, že potom nginx komunikuje (preposiela requesty) s vašim Node.js webom už len cez HTTP vám vadiť v zásade nemusí, ak sú oba na tom istom počítači alebo v tej istej sieti. Pekný deň do Poľska, Mifko

Pridať komentár

Máš niečo zaujímavé povedať k článku? Pridaj to k článku ako komentár. Spam, reklamu alebo inak nerelevantné komentáre okamžite mažem.

Pridanie komentára sa nepodarilo. Oprav si prosím chyby.