Ako zabezpečiť Nginx pomocou Let's Encrypt na Ubuntu


Úvod

Let’s Encrypt je certifikačná autorita (CA), ktorá poskytuje prístupný spôsob, ako získať a nainštalovať bezplatné TLS/SSL certifikáty, čím umožňuje šifrované HTTPS na webových serveroch. Proces zjednodušuje tým, že poskytuje softvérového klienta Certbot, ktorý sa snaží automatizovať väčšinu (ak nie všetky) potrebné kroky. V súčasnosti je celý proces získania a inštalácie certifikátu plne automatizovaný na serveroch Apache aj Nginx.

V tomto návode budete používať Certbot na získanie bezplatného SSL certifikátu pre Nginx na Ubuntu a nastavenie vášho certifikátu na automatickú obnovu.

Hlavné poznatky

  • Použite plugin Certbot pre Nginx na získanie a nainštalovanie bezplatných certifikátov Let’s Encrypt za niekoľko minút.
  • Funguje na Ubuntu 22.04 (Jammy), 24.04 (Noble) a 25.04 (Lunar).
  • Povoľte automatické obnovenie; certifikáty sú platné 90 dní a obnovujú sa automaticky.
  • Zosilnite HTTPS pomocou HSTS a moderných šifrovacích súprav; overte pomocou SSL Labs.
  • Uistite sa, že DNS A záznamy a porty 80/443 sú dostupné; väčšina zlyhaní overenia súvisí s sieťou alebo DNS.

Predpoklady

Na sledovanie tohto tutoriálu budete potrebovať:

  • Jeden server Ubuntu nastavený podľa tohto návodu na počiatočné nastavenie servera pre Ubuntu, vrátane používateľa s právami sudo, ktorý nie je root, a firewallu.

  • Registrované doménové meno. Tento návod bude používať example.com počas celého postupu. Doménové meno si môžete kúpiť cez Namecheap, alebo použiť Google Domains či ho zaregistrovať u vášho preferovaného registrátora domén.

  • Oba nasledujúce DNS záznamy sú nastavené pre váš server. Ak používate Linux-Console.net, pozrite si prosím našu dokumentáciu DNS pre podrobnosti o ich pridaní.

    • Záznam A s example.com, ktorý smeruje na verejnú IP adresu vášho servera.
    • Záznam A s www.example.com smerujúci na verejnú IP adresu vášho servera.
  • Nginx nainštalovaný podľa návodu Ako nainštalovať Nginx na Ubuntu. Uistite sa, že máte serverový blok pre svoju doménu. Tento tutoriál použije /etc/nginx/sites-available/example.com ako príklad.

Krok 1 — Inštalácia Certbotu

Certbot odporúča na inštaláciu použiť ich snap balík. Snap balíky fungujú takmer na všetkých linuxových distribúciách, ale vyžadujú, aby ste najprv nainštalovali snapd na spravovanie snap balíkov. Ubuntu obsahuje podporu pre snap (22.04, 24.04, 25.04). Začnite tým, že zabezpečíte, aby bol snapd aktuálny:

sudo snap install core; sudo snap refresh core

Ak pracujete na serveri, ktorý mal predtým nainštalovanú staršiu verziu certbotu, mali by ste ju pred pokračovaním odstrániť:

sudo apt remove certbot

Potom môžete nainštalovať balík certbot:

sudo snap install --classic certbot

Nakoniec môžete prepojiť príkaz certbot z inštalačného adresára snap na vašu cestu, takže ho budete môcť spustiť len zadaním certbot. Toto nie je potrebné na všetkých systémoch, ale snapy majú zvyčajne menej invazívne nastavenie, takže sa náhodou nebudú meniť s inými systémovými balíkmi:

sudo ln -s /snap/bin/certbot /usr/bin/certbot

Alternatívne (APT): V niektorých prostrediach bez snapd môžete inštalovať z úložísk Ubuntu:

sudo apt update

sudo apt install -y certbot python3-certbot-nginx

Distribúcia Snap zostáva odporúčanou inštalačnou metódou tímu Certbot pre najnovšie funkcie a včasné aktualizácie.

Teraz, keď máme nainštalovaný Certbot, spustime ho, aby sme získali náš certifikát.

Krok 2 — Overenie konfigurácie Nginx

Certbot musí byť schopný nájsť správny blok server vo vašej konfigurácii Nginx, aby mohol automaticky nastaviť SSL. Konkrétne to robí tak, že hľadá direktívu server_name, ktorá zodpovedá doméne, pre ktorú žiadate certifikát.

Ak ste postupovali podľa kroku nastavenia blokov servera v návode na inštaláciu Nginxu, mali by ste mať blok servera pre svoju doménu na /etc/nginx/sites-available/example.com s už vhodne nastavenou direktívou server_name.

Ak chcete skontrolovať, otvorte konfiguračný súbor pre vašu doménu pomocou nano alebo vášho obľúbeného textového editora:

sudo nano /etc/nginx/sites-available/example.com

Nájdite existujúci riadok server_name. Mal by vyzerať takto:

...
server_name example.com www.example.com;
...

Ak áno, ukončite svoj editor a pokračujte na ďalší krok.

Ak to nesedí, aktualizujte ho tak, aby zodpovedalo. Potom súbor uložte, zavrite editor a overte syntax svojich úprav konfigurácie:

sudo nginx -t

Ak sa objaví chyba, znova otvorte súbor blokového servera a skontrolujte, či nie sú žiadne preklepy alebo chýbajúce znaky. Keď bude syntax vášho konfiguračného súboru správna, znovu načítajte Nginx, aby sa načítala nová konfigurácia:

sudo systemctl reload nginx

Certbot teraz dokáže nájsť správny blok server a automaticky ho aktualizovať.

Ďalej aktualizujme firewall, aby povoľoval HTTPS prevádzku.

Krok 3 — Povolenie HTTPS cez firewall

Ak máte povolený firewall ufw, ako odporúčajú prípravné návody, budete musieť upraviť nastavenia, aby bolo povolené HTTPS pripojenie. Našťastie Nginx pri inštalácii zaregistruje niekoľko profilov v ufw.

Môžete zobraziť aktuálne nastavenie zadaním:

sudo ufw status

Bude to pravdepodobne vyzerať takto, čo znamená, že na webový server je povolený iba HTTP prenos:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Ak chcete navyše povoliť HTTPS prenos, povoľte profil Nginx Full a odstráňte nadbytočné povolenie profilu Nginx HTTP:

sudo ufw allow 'Nginx Full'

sudo ufw delete allow 'Nginx HTTP'

Váš stav by teraz mal vyzerať takto:

sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx Full (v6)            ALLOW       Anywhere (v6)

Ďalej spustíme Certbot a získame naše certifikáty.

Krok 4 — Získanie SSL certifikátu

Certbot poskytuje rôzne spôsoby, ako získať SSL certifikáty prostredníctvom pluginov. Plugin pre Nginx sa postará o prekódovanie Nginx a znovunačítanie konfigurácie vždy, keď je to potrebné. Ak chcete tento plugin použiť, zadajte nasledujúce:

sudo certbot --nginx -d example.com -d www.example.com

Toto spustí certbot s doplnkom --nginx, pričom sa používa -d na určenie názvov domén, pre ktoré chceme, aby bol certifikát platný.

Pri spustení príkazu budete vyzvaní na zadanie emailovej adresy a súhlas s podmienkami služby. Po vykonaní týchto krokov by ste mali vidieť správu, ktorá vám oznámi, že proces bol úspešný a kde sú uložené vaše certifikáty:

IMPORTANT NOTES:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem
Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem
This certificate expires on 2022-06-01.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

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

Vaše certifikáty sú stiahnuté, nainštalované a načítané a vaša konfigurácia Nginx teraz automaticky presmeruje všetky webové požiadavky na https://. Skúste obnoviť svoju webovú stránku a všimnite si indikátor zabezpečenia vo vašom prehliadači. Mal by ukazovať, že stránka je správne zabezpečená, zvyčajne s ikonou zámku. Ak otestujete svoj server pomocou SSL Labs Server Test, získa hodnotenie A.

Ukončime to testovaním procesu obnovy.

Krok 5 — Overenie automatickej obnovy Certbotu

Certifikáty Let’s Encrypt sú platné len deväťdesiat dní. Cieľom je motivovať používateľov, aby automatizovali proces obnovenia certifikátu. Balík certbot, ktorý sme nainštalovali, sa o to postará za nás pridaním systémového časovača (systemd), ktorý sa spustí dvakrát denne a automaticky obnoví akýkoľvek certifikát, ktorý má menej než tridsať dní do vypršania platnosti.

Stav časovača môžete skontrolovať pomocou systemctl:

sudo systemctl status snap.certbot.renew.service
○ snap.certbot.renew.service - Service for snap application certbot.renew
     Loaded: loaded (/etc/systemd/system/snap.certbot.renew.service; static)
     Active: inactive (dead)
TriggeredBy: ● snap.certbot.renew.timer

Ak chcete otestovať proces obnovenia, môžete vykonať skúšobné spustenie s certbot:

sudo certbot renew --dry-run

Ak nevidíte žiadne chyby, ste pripravení. V prípade potreby Certbot obnoví vaše certifikáty a znovu načíta Nginx, aby sa zmeny prejavili. Ak by proces automatickej obnovy niekedy zlyhal, Let’s Encrypt pošle správu na email, ktorý ste zadali, a upozorní vás, keď sa váš certifikát chystá expirovať.

Ak uprednostňujete hooky, môžete pridať post-hook na opätovné načítanie Nginxu len vtedy, keď sa obnoví certifikát:

sudo certbot renew --dry-run --post-hook "systemctl reload nginx"

Na systémoch používajúcich APT balíky môže za obnovy zodpovedať cron úloha; pri snape spúšťa systémový časovač systemd (snap.certbot.renew.timer) dvakrát denne.

Konfigurácia osvedčených postupov HTTPS (HSTS, šifry, presmerovania)

Posilnite svoju konfiguráciu TLS, aby ste znížili riziká zníženia úrovne zabezpečenia a zmiešaného obsahu.

  • Povoľte HSTS na vynútenie HTTPS v podporovaných prehliadačoch:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
  • Uprednostňujte moderné protokoly a šifry TLS (prispôsobte ich svojmu profilu rizika):
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
  • Presmerovať HTTP na HTTPS (Certbot to môže pridať automaticky):
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}
  • Overte svoju konfiguráciu pomocou priemyselných nástrojov:

    • Generátor konfigurácie SSL od Mozilly (https://ssl-config.mozilla.org)
    • Test servera SSL Labs (https://www.ssllabs.com/ssltest/)

Poznámka: Buďte opatrní pri prvom zapnutí HSTS. Ak nastavíte preload, odošlite svoju doménu až po potvrdení stabilného nastavenia HTTPS pre všetky subdomény.

PraťPrečo je to dôležité?Ako sa prihlásiť
Použite 301 z HTTP na HTTPSPoužívatelia sa rýchlo dostanú na bezpečnú URLCertbot automaticky píše presmerovania, alebo pridajte server na porte 80, ktorý vracia 301 https://$host$request_uri
Minimalizovať presmerovaniaMenej okružných ciest=rýchlejšie prvé vykreslenieNasmerujte DNS/kannonické odkazy na konečný HTTPS server; vyhnite sa reťazcom http → www → https
Servujte všetky aktíva cez HTTPSZabraňuje varovaniam o zmiešanom obsahu a poruchám používateľského rozhraniaAuditujte pomocou panela DevTools Security; aktualizujte CDN/URL adresy zdrojov na https://
Povoliť HTTP/2 a HTTP/3Rýchlejšie multiplexované doručovanie, lepší výkon na mobileV Nginx, listen 443 ssl http2; a, ak je podporované, http3/QUIC na 443/udp
Povoliť obnovenie relácie TLSRýchlejšie opakované návštevyZabezpečte ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d;
Zapnúť OCSP staplingRýchlejšia a spoľahlivejšia kontrola certifikátovssl_stapling zapnuté; ssl_stapling_verify zapnuté; s platným riešiteľom
Preferujte Brotli/GzipMenšie payloady pre HTML/CSS/JSPovoľte brotli on; (ak je modul prítomný) a gzip on; ako záložnú možnosť
Nastavte jasné kanonické HTTPS URLVyhnite sa duplicitnému obsahu a mätúcim URLPoužite <link rel="canonical" href="https://example.com/..."> a aktualizujte mapy stránok
Konsolidovať www vs apexPredvídateľné adresovanie a menej presmerovaníVyberte jednu hostiteľskú adresu; druhú na ňu trvalo presmerujte
Priateľské stránky s chybou TLS/údržbouZnížiť opustenie počas incidentovVlastná error_page 497/403/502/503 s jasnými ďalšími krokmi
Sledovať obnovenia a zlyhaniaZabráňte náhlym zablokovaniam kvôli vypršaniu platnosti certifikátuUpozornenie na záznamy certbot; externé kontroly; overená doručiteľnosť e-mailov
Fázujte HSTS opatrneVyhnite sa neúmyselnému uzamknutiu počas zavádzaniaZačnite bez preload; pridávajte subdomény postupne; overte pred odoslaním preload

Bežné problémy a riešenia

  • Výzva ACME HTTP-01 zlyhala: Skontrolujte, či je port 80 prístupný z internetu a nie je blokovaný bránou firewall alebo upstream load balancerom.
  • Nezhoda DNS: Overte, či záznamy A/AAAA pre example.com a www.example.com ukazujú na správnu verejnú IP adresu.
  • Nesprávny server_name v Nginx: Certbot vyhľadá serverový blok podľa server_name; overte, či zodpovedá požadovaným doménam.
  • Obmedzenia rýchlosti: Opakované neúspešné požiadavky môžu dosiahnuť limity rýchlosti Let's Encrypt. Pri testovaní používajte --dry-run a podľa potreby meníte subdomény.
  • Konflikty Snap vs APT: Pred inštaláciou Snap odstráňte staršiu verziu APT certbot, aby ste sa vyhli konfliktom ciest.

Často kladené otázky

1. Čo je Let’s Encrypt a ako funguje s Nginx?

Let’s Encrypt je bezplatná certifikačná autorita (CA), ktorá overuje kontrolu domény a vydáva SSL/TLS certifikáty prostredníctvom protokolu ACME. Certbot automatizuje overovanie domény (HTTP‑01 vo väčšine prípadov, DNS‑01 pre wildcard), vydávanie certifikátov, konfiguráciu Nginx a obnovenia. S pluginom Nginx Certbot aktualizuje váš server blok a zapisuje súbory certifikátu do /etc/letsencrypt/live/your_domain/.

2. Potrebujem doménové meno na používanie SSL od Let's Encrypt?

Áno. Verejne dôveryhodné certifikáty vyžadujú registrovanú doménu s verejným DNS smerujúcim na váš server — sú podporované iba názvy hostiteľov s IP adresou alebo verejné domény, nie sú podporované súkromné hostiteľské mená. Použite záznamy A/AAAA pre každý názov hostiteľa, ktorý požadujete. Wildcard certifikáty (napr. *.example.com) vyžadujú overenie DNS‑01 a prístup na úpravu DNS.

3. Ako nainštalujem Certbot na Ubuntu pre Nginx?

Použite snap (odporúčané): sudo snap install --classic certbot && sudo ln -s /snap/bin/certbot /usr/bin/certbot. Alternatívne, sudo apt install certbot python3-certbot-nginx.

Balík snap dostáva aktualizácie najrýchlejšie a obsahuje plugin pre Nginx. Overte verziu príkazom certbot --version. Ak snap nie je k dispozícii, funguje aj APT, ale môže byť pozadu v funkciách; uistite sa, že je nainštalovaný python3-certbot-nginx, aby Certbot mohol automaticky upravovať Nginx.

4. Môžem zabezpečiť viacero domén alebo subdomén jedným certifikátom?

Áno, Let’s Encrypt vám umožňuje zabezpečiť viacero domén a subdomén pomocou jedného certifikátu, známeho ako SAN (Subject Alternative Name) certifikát. Namiesto žiadosti a spravovania samostatných certifikátov pre každý hostname ich môžete všetky skombinovať pod jeden certifikát—čo výrazne zjednodušuje správu a obnovenie.

Ako na to:
Pri spúšťaní Certbotu môžete určiť každú doménu alebo subdoménu, ktorú chcete zahrnúť do svojho certifikátu, tak, že pre každú zopakujete príznak -d. Napríklad:

sudo certbot --nginx -d example.com -d www.example.com -d api.example.com

Tento príkaz získa jeden certifikát, ktorý je platný pre všetky tri mená (example.com, www.example.com, api.example.com). Certbot automaticky aktualizuje vašu konfiguráciu Nginx tak, aby používala nový certifikát pre všetky uvedené domény.

A čo wildcard domény?
Ak chcete certifikát, ktorý pokryje všetky subdomény (napríklad anything.example.com), môžete použiť wildcard doménu. To vyžaduje overenie DNS-01 (preukázanie, že máte kontrolu nad vašou DNS zónou), zvyčajne pridaním špeciálneho TXT záznamu u vášho poskytovateľa DNS. Napríklad:

sudo certbot --manual --preferred-challenges dns -d *.example.com -d example.com

Počas tohto procesu budete vyzvaní na vytvorenie konkrétnych DNS záznamov.

Ďalšie veci, ktoré je dobré vedieť:

  • Musíte zabezpečiť, aby všetky špecifikované domény boli správne nasmerované na váš server pred spustením Certbotu.
  • Majte na pamäti limity rýchlosti Let’s Encrypt: snažte sa zoskupiť súvisiace domény do čo najmenšieho počtu certifikátov, aby ste minimalizovali šancu na dosiahnutie týchto limitov.
  • Pri obnove si Certbot ponechá všetky pôvodné domény pohromade, pokiaľ si nepožiadate o novú sadu.

Používanie viacerých možností -d s Certbotom je odporúčaný spôsob, ako pokryť niekoľko domén/poddomén. Certifikáty s mnohými SAN sú ideálne pre weby a API v tom istom projekte alebo na tom istom serveri.

5. Ako môžem potvrdiť, že automatické obnovovanie funguje?

Spustite sudo systemctl status snap.certbot.renew.timer (snap) a sudo certbot renew --dry-run. Skontrolujte logy v /var/log/letsencrypt/. Môžete tiež overiť dátum vypršania:

openssl x509 -in /etc/letsencrypt/live/your_domain/fullchain.pem -noout -enddate

V prípade úspechu sa obnovenia vykonajú automaticky, keď certifikát vyprší do 30 dní, a Nginx sa znovu načíta.

6. Ako nakonfigurujem Nginx na používanie certifikátu Let’s Encrypt?

Certbot automaticky konfiguruje Nginx s certifikátom Let’s Encrypt. Typické direktívy vo vašom TLS server bloku sú:

ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;

Overte pomocou sudo nginx -t a uplatnite pomocou sudo systemctl reload nginx.

7. Ako môžem otestovať, či je moja konfigurácia HTTPS správna?

Použite externé testy a kontroly klienta:

  • Test servera SSL Labs: https://www.ssllabs.com/ssltest/
  • Pokyny pre generátor konfigurácie SSL od Mozilly: https://ssl-config.mozilla.org
  • Rýchle kontroly:
curl -I http://example.com      # Expect 301 to https

curl -I https://example.com     # Confirm 200 and HSTS if enabled

openssl s_client -connect example.com:443 -servername example.com -tls1_3 < /dev/null | openssl x509 -noout -dates -issuer -subject

Tiež otvorte Nástroje pre vývojárov → Zabezpečenie, aby ste našli varovania o zmiešanom obsahu.

8. Ako nastavím automatické obnovenie certifikátov Let's Encrypt?

Pri inštaláciách cez snap spúšťa systémový časovač systemd (snap.certbot.renew.timer) dvakrát denne a obnovuje certifikáty, ktoré sa blížia k vypršaniu. Overte pomocou systemctl status a simulujte pomocou sudo certbot renew --dry-run. Ak potrebujete háky, použite:

sudo certbot renew --post-hook "systemctl reload nginx"

Uistite sa, že porty 80/443 sú dostupné, DNS je správne nastavené a notifikačný e-mail je sledovaný, aby boli problémy s obnovením zaznamenané včas.

Záver

V tomto návode ste nainštalovali klienta Let’s Encrypt certbot, stiahli SSL certifikáty pre vašu doménu, nakonfigurovali Nginx na použitie týchto certifikátov a nastavili automatickú obnovu certifikátov. Tiež ste posilnili svoju konfiguráciu TLS pomocou HSTS a moderných šifier a prešli bežné kroky riešenia problémov. Ak máte ďalšie otázky týkajúce sa používania Certbotu, oficiálna dokumentácia je dobré miesto, kde začať.

Pozri do budúcnosti: Pre tímy spravujúce mnoho domén zvážte automatizáciu infraštruktúry ako kód (napr. Ansible role pre Nginx + Certbot), výzvy DNS-01 pre wildcard certifikáty a proaktívne sledovanie certifikátov s upozorneniami — oblasti vhodné pre samostatného pokročilého sprievodcu.

Ďalšie čítanie

  • Ako nainštalovať Nginx na Ubuntu: Nainštalujte Nginx, spravujte službu, otvorte firewall a nastavte bloky servera.
  • Ako zabezpečiť Nginx pomocou Let’s Encrypt na Ubuntu 20.04: Staršia verzia Ubuntu pokrývajúca vydávanie Certbotu, presmerovania na HTTPS a automatické obnovenie.
  • Ako získať certifikát Let’s Encrypt pomocou DNS overenia: Použite výzvy DNS‑01 (cez acme‑dns/Certbot) pre wildcard certifikáty alebo keď nie je možné HTTP overenie.
  • Ako opraviť bežné chyby Let’s Encrypt: Riešenie problémov s ACME výzvami, dosiahnuteľnosťou DNS/HTTP, limitmi rýchlosti a problémami s obnovou.

Ďakujeme, že sa učíte s komunitou Linux-Console.net.