Let’s Encrypt je bezplatná, automatizovaná a otevřená certifikační autorita vyvinutá organizací Internet Security Research Group (ISRG), která poskytuje bezplatné certifikáty SSL.
Certifikáty vydané Let’s Encrypt jsou důvěryhodné pro všechny hlavní prohlížeče a jsou platné 90 dní od data vydání.
Tento tutoriál vysvětluje, jak nainstalovat bezplatný certifikát Let’s Encrypt SSL na Ubuntu 20.04, na kterém běží Nginx jako webový server. Také si ukážeme, jak nakonfigurovat Nginx, aby používal certifikát SSL a povolil HTTP/2.
Předpoklady #
Než budete pokračovat, ujistěte se, že jste splnili následující předpoklady:
- Máte název domény odkazující na vaši veřejnou IP. Použijeme
example.com
. - Na svém serveru CentOS máte nainstalovaný Nginx.
- Váš firewall je nakonfigurován tak, aby přijímal připojení na portech 80 a 443.
Instalace Certbota #
K získání a obnovení certifikátů použijeme certbot.
Certbot je plně vybavený a snadno použitelný nástroj, který automatizuje úlohy získávání a obnovování certifikátů Let’s Encrypt SSL a konfiguraci webových serverů pro použití certifikátů.
Balíček certbot je součástí výchozích úložišť Ubuntu. Chcete-li jej nainstalovat, spusťte následující příkazy:
sudo apt update
sudo apt install certbot
Generování silné Dh (Diffie-Hellman) skupiny #
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 zadáním následujícího příkazu:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Můžete také použít délku klíče až 4096 bitů, ale generování může 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 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 požadovaná doména se 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 umožní jej zapisovat 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
Abychom se vyhnuli duplikaci kódu, vytvoříme dva úryvky a zahrneme je do všech souborů bloků serveru Nginx.
Otevřete textový editor a vytvořte první úryvek, letsencrypt.conf
:
sudo nano /etc/nginx/snippets/letsencrypt.conf
/etc/nginx/snippets/letsencrypt.conflocation ^~ /.well-known/acme-challenge/ {
allow all;
root /var/lib/letsencrypt/;
default_type "text/plain";
try_files $uri =404;
}
Dále vytvořte druhý fragment, ssl.conf
, který zahrnuje č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í.
sudo nano /etc/nginx/snippets/ssl.conf
/etc/nginx/snippets/ssl.confssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
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=31536000; includeSubDomains" always;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
Po vytvoření úryvků otevřete blokový soubor doménového serveru a zahrňte soubor letsencrypt.conf
úryvek, jak je uvedeno níže:
sudo nano /etc/nginx/sites-available/example.com.conf
/etc/nginx/sites-available/example.com.confserver {
listen 80;
server_name example.com www.example.com;
include snippets/letsencrypt.conf;
}
Chcete-li povolit nový blok serveru, vytvořte ze souboru symbolický odkaz na sites-enabled
adresář:
sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/
Restartujte službu Nginx, aby se změny projevily:
sudo systemctl restart nginx
Nyní můžete spustit Certbot s pluginem webroot a získat soubory certifikátu SSL vydáním:
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 2020-10-18. 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"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- 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áte soubory certifikátu, můžete upravit blokování doménového serveru následovně:
sudo nano /etc/nginx/sites-available/example.com.conf
/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 přesměrování HTTPSand z verze www na verzi bez www.
Znovu načtěte službu Nginx, aby se změny projevily:
sudo systemctl reload nginx
Chcete-li ověřit, zda je certifikát SSL úspěšně nainstalován, otevřete svůj web pomocí https://
a všimnete si zelené ikony zámku.
Pokud svou doménu otestujete pomocí testu serveru SSL Labs, získáte A+
stupeň, jak je znázorněno na obrázku níže:
Automatické obnovení certifikátu Let’s Encrypt 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 a systemd timer. Časovač automaticky obnoví certifikáty 30 dní před vypršením platnosti.
Když je certifikát obnoven, je třeba znovu načíst službu nginx. Otevřete /etc/letsencrypt/cli.ini
a přidejte následující řádek:
sudo nano /etc/letsencrypt/cli.ini
/etc/cron.d/certbotdeploy-hook = systemctl reload nginx
Chcete-li otestovat proces obnovení, spusťte certbot --dry-run
příkaz:
sudo certbot renew --dry-run
Pokud nejsou žádné chyby, znamená to, že proces obnovení byl úspěšný.