Let’s Encrypt je bezplatná a otevřená certifikační autorita vyvinutá organizací Internet Security Research Group (ISRG). Certifikáty vydané Let’s Encrypt dnes důvěřují téměř všem prohlížečům.
V tomto tutoriálu poskytneme podrobné pokyny, jak zabezpečit Nginx pomocí Let's Encrypt pomocí nástroje certbot na Ubuntu 16.04.
Předpoklady #
Než budete pokračovat v tomto kurzu, ujistěte se, že jste splnili následující předpoklady:
- Máte název domény odkazující na IP vašeho veřejného serveru. V tomto tutoriálu budeme používat
example.com
. - Máte nainstalovaný Nginx podle postupu Jak nainstalovat Nginx na Ubuntu 16.04.
Instalovat Certbot #
Certbot je nástroj napsaný v pythonu, který dokáže automatizovat úlohy získávání a obnovování certifikátů Let’s Encrypt SSL a konfiguraci webových serverů.
Nejprve nainstalujte software-properties-common
balíček, který poskytuje add-apt-repository
nástroj potřebný pro přidávání dalších PPA.
Aktualizujte index balíčků a nainstalujte software-properties-common
s:
sudo apt update
sudo apt install software-properties-common
Po dokončení instalace přidejte úložiště certbot PPA do svého systému pomocí následujícího příkazu:
sudo add-apt-repository ppa:certbot/certbot
Aktualizujte seznam balíčků a nainstalujte balíček certbot:
sudo apt update
sudo apt install certbot
Generate Strong Dh (Diffie-Hellman) Group #
Výměna klíčů Diffie–Hellman (DH) je metoda bezpečné výměny kryptografických klíčů přes nezabezpečený komunikační kanál. Vygenerujte novou sadu 2048bitových parametrů DH pro posílení zabezpečení:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Pokud chcete, můžete změnit velikost až na 4096 bitů, ale v takovém případě může generování trvat déle než 30 minut v závislosti na entropii systému. Získání certifikátu Let’s Encrypt SSL #
K získání certifikátu SSL pro naši doménu použijeme plugin Webroot, který funguje tak, že vytvoří dočasný soubor pro ověření požadované domény v ${webroot-path}/.well-known/acme-challenge
adresář. Server Let's Encrypt odesílá požadavky HTTP na dočasný soubor, aby ověřil, že se požadovaná doména překládá na server, na kterém běží certbot.
Aby to bylo jednodušší, namapujeme všechny požadavky HTTP pro .well-known/acme-challenge
do jednoho adresáře, /var/lib/letsencrypt
.
Následující příkazy vytvoří adresář a učiní jej zapisovatelný pro server Nginx.
sudo mkdir -p /var/lib/letsencrypt/.well-known
sudo chgrp www-data /var/lib/letsencrypt
sudo chmod g+s /var/lib/letsencrypt
Abyste se vyhnuli duplikaci kódu, vytvořte následující dva úryvky, které zahrneme do všech blokových souborů našeho serveru Nginx.
/etc/nginx/snippets/letsencrypt.conflocation ^~ /.well-known/acme-challenge/ {
allow all;
root /var/lib/letsencrypt/;
default_type "text/plain";
try_files $uri =404;
}
/etc/nginx/snippets/ssl.confssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 30s;
add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
Výše uvedený fragment obsahuje čipy doporučené Mozillou, umožňuje sešívání OCSP, HTTP Strict Transport Security (HSTS) a vynucuje několik hlaviček HTTP zaměřených na zabezpečení.
Po vytvoření úryvků otevřete blok doménového serveru a zahrňte letsencrypt.conf
úryvek, jak je uvedeno níže:
server {
listen 80;
server_name example.com www.example.com;
include snippets/letsencrypt.conf;
}
Aktivujte blok serveru vytvořením symbolického odkazu z sites-available
na sites-enabled
:
sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/example.com.conf
Znovu načtěte konfiguraci Nginx, aby se změny projevily:
sudo systemctl reload nginx
Spusťte skript certbot s pluginem webroot a získejte soubory certifikátu SSL:
sudo certbot certonly --agree-tos --email [email protected] --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com
Pokud je certifikát SSL úspěšně získán, certbot vytiskne následující zprávu:
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com/privkey.pem
Your cert will expire on 2018-04-23. 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
Nyní, když máme soubory certifikátu, upravte blok doménového serveru následovně:
/etc/nginx/sites-available/example.com.confserver {
listen 80;
server_name www.example.com example.com;
include snippets/letsencrypt.conf;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
include snippets/ssl.conf;
include snippets/letsencrypt.conf;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
include snippets/ssl.conf;
include snippets/letsencrypt.conf;
# . . . other code
}
S výše uvedenou konfigurací vynucujeme HTTPS a přesměrováváme www
verzi domény na non www
verze.
Znovu načtěte službu Nginx, aby se změny projevily:
sudo systemctl reload nginx
Automatické obnovení certifikátu SSL #
Certifikáty Let’s Encrypt jsou platné 90 dní. Aby se automaticky obnovily certifikáty před vypršením jejich platnosti, vytvoří balíček certbot cronjob, který se bude spouštět dvakrát denně a automaticky obnoví jakýkoli certifikát 30 dní před vypršením jeho platnosti.
Protože po obnovení certifikátu používáme zásuvný modul certbot webroot, musíme také znovu načíst službu nginx. Chcete-li tak učinit, připojte --renew-hook "systemctl reload nginx"
do /etc/cron.d/certbot
soubor, takže to vypadá takto:
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-hook "systemctl reload nginx"
Chcete-li otestovat proces obnovení, použijte certbot --dry-run
přepínač:
sudo certbot renew --dry-run
Pokud nejsou žádné chyby, znamená to, že proces obnovení byl úspěšný.