Let's Encrypt SSL sertifikāts Nginx serverim ar certbot

Palaist serverī ar vienu komandu (vispirms pārbaudiet skripta saturu zemāk):

curl -sSL https://cp.lv/scripts/besplatnyj-ssl-lets-encrypt.sh | sudo bash

…vai ar wget:

wget -qO- https://cp.lv/scripts/besplatnyj-ssl-lets-encrypt.sh | sudo bash

Skripta saturs besplatnyj-ssl-lets-encrypt.sh:

#!/usr/bin/env bash
# Let's Encrypt sertifikāta izdošana Nginx serverim
set -e
export DEBIAN_FRONTEND=noninteractive

DOMAIN=example.com
[email protected]

# 1. Atvērt portus 80 un 443
sudo ufw allow 'Nginx Full' || true

# 2. Uzstādīt certbot ar Nginx spraudni
sudo apt-get update
sudo apt-get install -y certbot python3-certbot-nginx

# 3. Izdot sertifikātu un iestatīt HTTPS novirzi (neinteraktīvi)
sudo certbot --nginx -d ${DOMAIN} -d www.${DOMAIN} \
  --non-interactive --agree-tos -m ${EMAIL} --redirect

# 4. Pārbaudīt Nginx konfigurāciju un automātisko atjaunošanu
sudo nginx -t && sudo systemctl reload nginx
sudo certbot renew --dry-run

echo "Gatavs: HTTPS domēnam ${DOMAIN} ieslēgts, automātiskā atjaunošana iestatīta."

Let’s Encrypt ir bezpeļņas sertifikācijas centrs, kas izsniedz TLS sertifikātus bez maksas: pats sertifikāts neko nemaksā, bet certbot to izdod un atjauno automātiski. Zemāk — kā ieslēgt HTTPS Nginx vietnei dažu minūšu laikā.

Kas nepieciešams iepriekš

  • Domēns, kura A ieraksts norāda uz jūsu servera IP.
  • Strādājošs Nginx server block ar korektu server_name.
  • Atvērti porti 80 un 443:
sudo ufw allow 'Nginx Full'

Ports 80 ir obligāts — pa to Let’s Encrypt pārbauda domēna piederību (HTTP-01 challenge).

Ja server block vēl nav izveidots, atveriet konfigurāciju redaktorā (nano, vim vai mcedit):

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

Minimāla HTTP konfigurācija domēna pārbaudei (vēlāk certbot te pierakstīs HTTPS):

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.html;
}

Vai arī izveidojiet konfigurāciju uzreiz ar vienu komandu — nokopējiet un ielīmējiet konsolē (pēdiņas 'EOF' ir svarīgas, lai Nginx neaiztiktu $ mainīgos):

sudo tee /etc/nginx/sites-available/example.com > /dev/null << 'EOF'
server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.html;
}
EOF
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

1. solis. Certbot uzstādīšana

Ieteicamais veids ir caur snap — tur vienmēr ir svaigākā versija:

sudo snap install core && sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

Alternatīva caur apt (ja snap nav pieejams):

sudo apt install certbot python3-certbot-nginx -y

2. solis. Sertifikāta izdošana

Nginx spraudnis pats atradīs vajadzīgo server block, izdos sertifikātu un ierakstīs HTTPS iestatījumus:

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

Certbot pajautās e-pastu (paziņojumiem par termiņa beigām) un piekrišanu noteikumiem. Uz jautājumu par novirzi izvēlieties variantu ar pāradresāciju HTTP → HTTPS. Pēc veiksmīgas izdošanas sertifikāts saglabāsies mapē /etc/letsencrypt/live/example.com/.

3. solis. Ko certbot pievieno konfigurācijā

Pēc izdošanas server block parādīsies rindas:

listen 443 ssl;
ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

Un atsevišķs novirzes bloks no 80. porta uz HTTPS. Pārbaudiet un pārlādējiet:

sudo nginx -t
sudo systemctl reload nginx

4. solis. Automātiskās atjaunošanas pārbaude

Let’s Encrypt sertifikāti darbojas 90 dienas. Certbot uzstāda systemd taimeri, kas tos atjauno automātiski. Pārbaudiet taimeri un izpildiet testa atjaunošanu:

systemctl list-timers | grep certbot
sudo certbot renew --dry-run

Ja --dry-run beidzās bez kļūdām, arī īstā atjaunošana izdosies. Nekas ar rokām nav jādara.

5. solis. HTTPS pārbaude

Atveriet https://example.com — adreses joslā parādīsies slēdzene. Ķēdi un termiņu var pārbaudīt no konsoles:

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates

Noderīgas certbot komandas

Uzdevums Komanda
Sertifikātu saraksts sudo certbot certificates
Atjaunot tūlīt sudo certbot renew
Atsaukt sertifikātu sudo certbot revoke --cert-name example.com
Pievienot domēnu sudo certbot --nginx -d example.com -d shop.example.com

Biežākie jautājumi

Vai Let’s Encrypt sertifikāts tiešām neko nemaksā? Jā, sertifikācijas centrs Let’s Encrypt izsniedz un atjauno sertifikātus bez maksas — tāds ir tā darbības modelis. Maksa ir tikai par pašu serveri, uz kura strādā vietne.

Ko darīt, ja certbot raksta «challenge failed»? Visbiežāk domēna A ieraksts vēl nenorāda uz serveri vai ir slēgts ports 80. Pārbaudiet DNS (dig example.com) un ugunsmūra noteikumus.

Sertifikāts uz 90 dienām — vai būs jāatjauno ar rokām? Nē. Certbot uzstāda automātiskās atjaunošanas taimeri. Pārbaudiet to ar komandu certbot renew --dry-run — ar to pietiek.

Vai var izdot wildcard sertifikātu (*.example.com)? Jā, taču vajadzēs DNS-01 challenge un spraudni jūsu DNS pakalpojumu sniedzējam, jo HTTP pārbaude apakšdomēniem neder.

HTTPS mūsdienās ir obligāts jebkurai vietnei: tas ietekmē gan lietotāju uzticēšanos, gan ranžēšanu. Izvietot vietni ar sertifikātu var uz tarifiem lapā VPS serveru noma, bet veikaliem un CMS — WordPress VPS.

Kristaps Bērziņš