Let’s Encrypt je bezplatná, open source a automatizovaná certifikační autorita (CA) propagovaná společností Internet Security Research Group (ISRG) a nabízí certifikáty SSL/TLS pro šifrování komunikace zahrnující dvě strany.
Certifikát SSL na vašem webu nejen zvýší zabezpečení vašeho webu pomocí šifrování, ale také zlepší hodnocení SEO vašeho webu, protože Google zavedl povinné zahrnutí certifikátu SSL pro lepší hodnocení SEO.
V tomto článku se budeme ptát, jak zabezpečit server NGINX pomocí certifikátu Let’s Encrypt SSL v Ubuntu 18.04.
Předpoklady
- Máte oprávnění otevřít relaci SSH na serveru Ubuntu 18.04 buď pomocí uživatele root nebo pomocí uživatele s povoleným sudo.
- Už jste si nainstalovali NGINX podle našeho výukového programu odtud.
- Název registrované domény.
- DNS Záznam, který ukazuje na IP adresu vašeho serveru na základě názvu domény, kterou chcete použít.
Nainstalujte knihovnu Let’s Encrypt Client
Úplně prvním krokem, který musíte provést, je nainstalovat klientskou knihovnu Let’s Encrypt, která bude zase použita k vyžádání certifikátů od autority LE. Jedním ze způsobů, jak toho dosáhnout, je naklonovat klientskou knihovnu Let’s Encrypt z jejího oficiálního úložiště na vašem serveru.
Je také možné nainstalovat totéž z oficiálního úložiště Ubuntu. V úložišti Ubuntu je klientská knihovna známá jako certbot poskytované vývojáři Let’s Encrypt. Ale zvolíme dřívější způsob instalace, tj. klonováním úložiště Github Let’s Encrypt.
Chcete-li to provést, přejděte do zvolené instalační složky a naklonujte úložiště. Instalační složku jsem zvolil jako /usr/local
, můžete si vybrat jinou složku podle vašeho prostředí.
# apt-get install git
# cd /usr/local
# git clone https://github.com/letsencrypt/letsencrypt
Přejděte do složky letsencrypt, najdete všechny klonované složky a soubory včetně certbota, které Let’s encrypt potřebuje, aby pro vás získal certifikáty.
Seznam umožňuje zašifrovat složku
Nakonfigurujte Let’s Encrypt pro ověření vaší domény
V procesu načítání certifikátu vytvoří klient Let’s Encrypt dočasný soubor v .well-known/acme-challenge
složku. Tento soubor obsahuje token pro ověření skutečnosti, že skutečně vlastníte doménu, pro kterou se pokoušíte načíst certifikáty. Pamatujte, že uvedená složka spadá pod webový kořen domény.
Proto je bezpodmínečně nutné, aby Let’s Encrypt měl přístup k dočasnému souboru za účelem ověření domény. Chcete-li udělit přístup, musíte nakonfigurovat NGINX, protože je vlastníkem webového kořenového adresáře pro doménu. Přidejte blok umístění speciálně pro složku /.well-known/acme-challenge
což umožní Let’s Encrypt umístit token pro ověření domény. Chcete-li to provést, upravte konfigurační soubor NGINX pro svého virtuálního hostitele. Nezapomeňte upravit kořenovou složku podle vašeho prostředí.
server {
listen 80;
server_name SUBDOMAIN.DOMAIN.TLD;
root /var/www/html/wordpress;
...
...
...
location /.well-known/acme-challenge {
allow all;
default_type "text/plain";
}
...
...
}
Ověřte, že je konfigurační soubor syntakticky správný, a restartujte NGINX:
# nginx -t
# systemctl restart nginx
Konfigurace brány UFW Firewall
Ubuntu 18.04 se dodává s výchozím správcem firewallu UFW a pokud jste jej již povolili a běží na vašem serveru, nebude povoleno připojení HTTP nebo HTTPS k serveru NGINX.
Je také možné, že se pokoušíte nainstalovat certifikáty na dříve nakonfigurovaný server a pravidla brány firewall již existují. Pravidla brány firewall můžete samozřejmě vypsat pomocí ufw status
než budete pokračovat v povolení připojení HTTP a HTTPS na vašem serveru Ubuntu 18.04.
Spuštěním následující sady příkazů v terminálu povolte připojení HTTP a HTTPS na vašem serveru.
# ufw status
# ufw allow http
# ufw allow https
# ufw reload
Požádejte o šifrování SSL certifikátu
Požádejme o SSL certifikát pro vybranou doménu pomocí klienta Let’s Encrypt, kterého jsme dříve naklonovali. Přestože je k dispozici mnoho možností konfigurace, které lze použít se skriptem Let’s Encrypt při žádosti o certifikát, použijeme pouze následující možnosti.
- určitě :Tato možnost říká skriptu letsencrypt, aby získal pouze certifikát SSL. Konfiguraci NGINX provedeme ručně později.
- webroot :Tato možnost určuje plugin webroot, který se má použít v procesu ověřování názvu domény.
- webroot-path :Tato možnost nastavuje kořen domény a musí odkazovat na umístění webu, které jste nakonfigurovali v konfiguraci NGINX.
- souhlasím :Znamená souhlas se smluvními podmínkami Let’s Encrypt.
- e-mail :E-mail se používá k obdržení oznámení o vypršení platnosti od Let’s Encrypt, ale lze jej také použít k obnovení ztraceného klíče.
- d :Tato možnost určuje název domény, pro kterou bude požadován certifikát.
Nyní zkombinujte výše uvedené možnosti spolu s klientským skriptem letsencrypt a požádejte o certifikát pomocí následujících příkazů:
# cd /usr/local/letsencrypt
# ./letsencrypt-auto certonly --agree-tos --email [email protected] --webroot --webroot-path /var/www/html/wordpress -d SUBDOMAIN.DOMAIN.TLD
Načteno Umožňuje úspěšně zašifrovat certifikát
Skript Let’s Encrypt vám po úspěšném načtení certifikátů SSL zobrazí malou poznámku a certifikáty se uloží do /etc/letsencrypt/live
složka.
Nakonfigurujte NGINX pro Let’s Encrypt SSL Certificate
V této fázi byl řetězec certifikátů Let’s Encrypt úspěšně uložen na váš server. Nyní pokračujte v konfiguraci souboru virtuálního hostitele pro zabezpečený webový server NGINX s povoleným SSL.
Vygenerujte klíč Diffie-Hellman
Ačkoli je použití klíče Diffie-Hellman při konfiguraci certifikátů Let’s Encrypt pomocí NGINX volitelné, primárně se používá jako metoda bezpečné výměny kryptografických klíčů pro použití v certifikátu Let’s encrypt.
# mkdir -p /etc/nginx/ssl
# cd /etc/nginx/ssl
# openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096
Umístil jsem soubor parametrů DH do /etc/nginx/ssl
adresář jednoduše pro pohodlí. Soubor můžete umístit na jiné místo.
Konfigurace parametrů SSL
Dále přidejte parametry pro připojení SSL, jako jsou verze protokolů, šifrovací sady, relace, hlavičky, které by měl váš server podporovat, do samostatného souboru.
Tím se nastaví silná šifrovací sada, která povolí dopředné utajení, kdykoli je to možné. Dále také umožníme HSTS a HPKP zpevnit server NGINX pro připojení SSL. To umožní silnou a do budoucna odolnou konfiguraci SSL, abyste získali hodnocení A+ v testu SSL Qualys Labs .
# vi /etc/nginx/conf.d/ssl.conf
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
server_tokens off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
#Online Certificate Status Protocol Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_session_tickets off;
#HTTP Strict Transport Security
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
ssl_trusted_certificate /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options nosniff;
add_header X-Robots-Tag none;
Upravit virtuálního hostitele NGINX
Nakonec upravte bloky serveru NGINX pro vybranou doménu. Přejděte do výchozího umístění pro bloky serveru NGINX, což je /etc/nginx/sites-available
a upravte soubor virtuálního hostitele NGINX.
# vi /etc/nginx/sites-available/your_nginx_file.conf
server {
listen 80;
listen [::]:80;
server_name SUBDOMAIN.DOMAIN.TLD;
return 301 https://$host$request_uri;
}
...
...
Výše uvedený blok serveru dává NGINX pokyn, aby naslouchal všem příchozím požadavkům na portu 80 pro doménu SUBDOMAIN.DOMAIN.TLD
a přesměrujte totéž do sekce https, jejíž konfigurace je uvedena níže.
...
...
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
root /var/www/html/wordpress;
index index.html index.php index.htm;
server_name SUBDOMAIN.DOMAIN.TLD;
error_log /var/log/nginx/SUBDOMAIN.DOMAIN.TLD-error.log debug;
access_log /var/log/nginx/SUBDOMAIN.DOMAIN.TLD-access.log;
ssl_certificate /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/privkey.pem;
include /etc/nginx/conf.d/ssl.conf;
location /.well-known/acme-challenge {
allow all;
default_type "text/plain";
}
location / {
try_files $uri $uri/ =404;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}
Zkontrolujte, zda konfigurační soubor neobsahuje nějakou syntaktickou chybu:
# nginx -t
Chcete-li aktivovat blok serveru, vytvořte symbolický odkaz na výše uvedený konfigurační soubor virtuálního hostitele uvnitř /etc/nginx/sites-enabled
složka.
# cd /etc/nginx/sites-enabled
# ln -s ../sites-available/your_nginx_file.conf .
Chcete-li použít nová nastavení, znovu načtěte NGINX:
# systemctl reload nginx
Chcete-li analyzovat konfiguraci výše uvedených nastavení SSL, nasměrujte svůj prohlížeč na Test SSL Labs, zadejte název své domény a klikněte na „Odeslat“. Počkejte minutu, než se zobrazí souhrn testu. Hodnocení A+ znamená, že jsme do procesu zabezpečení serveru NGINX zahrnuli většinu možností SSL.
Automatické obnovení certifikátu Let’s Encrypt
Certifikáty Let’s Encrypt mají platnost 90 dní. Důvodem je omezit škody způsobené kompromisem klíče a podpořit automatizaci.
Chcete-li zautomatizovat proces obnovy certifikátu, vytvořte cronjob pomocí crontab a přidejte řádek skriptu, který se spustí jednou týdně, aby se obnovily certifikáty, když jejich platnost brzy vyprší.
# crontab -e
45 4 * * 6 cd /usr/local/letsencrypt/ && ./certbot-auto renew && systemctl restart nginx
Výše uvedený jednořádkový skript se spustí každou sobotu, aby zkontroloval, zda jsou certifikáty k obnovení, a pokud ano, obnoví certifikáty a poté restartuje NGINX server.
Všimněte si, že není plně optimalizován, protože server NGINX se restartuje, i když certifikát není obnoven. Nejlepší možností by bylo napsat vlastní skript pro obnovení certifikátu SSL a restartování serveru NGINX, pokud jsou certifikáty skutečně obnoveny.
Závěr
V tomto článku jsme se naučili, jak nainstalovat klientskou knihovnu Let’s Encrypt, požádat o certifikát pro vaši doménu a jak nakonfigurovat certifikáty Let’s Encrypt SSL pomocí NGINX. Dále, příklad cronjob také ukazuje, jak se pravidelně starat o proces obnovy certifikátu.