Let's Encrypt SSL su certbot Nginx serveryje

Paleiskite serveryje viena komanda (pirmiausia patikrinkite skripto turinį žemiau):

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

…arba su wget:

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

Skripto turinys besplatnyj-ssl-lets-encrypt.sh:

#!/usr/bin/env bash
# Issue a Let's Encrypt certificate for Nginx
set -e
export DEBIAN_FRONTEND=noninteractive

DOMAIN=example.com
[email protected]

# 1. Open ports 80 and 443
sudo ufw allow 'Nginx Full' || true

# 2. Install certbot with the Nginx plugin
sudo apt-get update
sudo apt-get install -y certbot python3-certbot-nginx

# 3. Issue the certificate and set up the HTTPS redirect (non-interactive)
sudo certbot --nginx -d ${DOMAIN} -d www.${DOMAIN} \
  --non-interactive --agree-tos -m ${EMAIL} --redirect

# 4. Check the Nginx config and automatic renewal
sudo nginx -t && sudo systemctl reload nginx
sudo certbot renew --dry-run

echo "Done: HTTPS is enabled for ${DOMAIN}, automatic renewal is configured."

Let’s Encrypt yra nekomercinė sertifikavimo įstaiga, kuri TLS sertifikatus išduoda be mokesčio: pats sertifikatas nieko nekainuoja, o išduodamas ir atnaujinamas automatiškai certbot įrankiu. Žemiau — kaip per kelias minutes įjungti HTTPS Nginx svetainei.

Ko reikia iš anksto

  • Domenas, kurio A įrašas nukreiptas į jūsų serverio IP.
  • Veikiantis Nginx server block su teisingu server_name.
  • Atidaryti 80 ir 443 prievadai:
sudo ufw allow 'Nginx Full'

80 prievadas privalomas — juo Let’s Encrypt tikrina domeno valdymą (HTTP-01 challenge).

Jei server block dar nesukurtas, atidarykite konfigūraciją redaktoriuje (nano, vim arba mcedit):

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

Minimali HTTP konfigūracija domeno patikrai (vėliau certbot čia pridės HTTPS):

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

Arba sukurkite visą konfigūraciją viena komanda — nukopijuokite ir įklijuokite į konsolę (kabutės 'EOF' svarbios, kad Nginx neliestų $ kintamųjų):

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 žingsnis. Certbot diegimas

Rekomenduojamas būdas — per snap, jame visada yra naujausia versija:

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

Alternatyva per apt (jei snap nepasiekiamas):

sudo apt install certbot python3-certbot-nginx -y

2 žingsnis. Sertifikato išdavimas

Nginx papildinys pats suras reikiamą server block, išduos sertifikatą ir įrašys HTTPS nustatymus:

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

Certbot paklaus el. pašto (pranešimams apie galiojimo pabaigą) ir sutikimo su sąlygomis. Ties klausimu apie peradresavimą pasirinkite variantą su nukreipimu HTTP → HTTPS. Sėkmingai išdavus, sertifikatas bus išsaugotas kataloge /etc/letsencrypt/live/example.com/.

3 žingsnis. Ką certbot prideda į konfigūraciją

Po išdavimo server block atsiras eilutės:

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;

Ir atskiras peradresavimo blokas iš 80 prievado į HTTPS. Patikrinkite ir perkraukite:

sudo nginx -t
sudo systemctl reload nginx

4 žingsnis. Automatinio atnaujinimo patikra

Let’s Encrypt sertifikatai galioja 90 dienų. Certbot įdiegia systemd laikmatį, kuris juos atnaujina automatiškai. Patikrinkite laikmatį ir paleiskite bandomąjį atnaujinimą:

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

Jei --dry-run baigėsi be klaidų — realus atnaujinimas taip pat pavyks. Rankomis nieko daryti nereikia.

5 žingsnis. HTTPS patikra

Atidarykite https://example.com — adreso juostoje pasirodys spynelė. Grandinę ir galiojimo laiką galima patikrinti iš konsolės:

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

Naudingos certbot komandos

Užduotis Komanda
Sertifikatų sąrašas sudo certbot certificates
Atnaujinti dabar sudo certbot renew
Atšaukti sertifikatą sudo certbot revoke --cert-name example.com
Pridėti domeną sudo certbot --nginx -d example.com -d shop.example.com

Dažni klausimai

Ar Let’s Encrypt sertifikatas tikrai nieko nekainuoja? Taip, Let’s Encrypt sertifikavimo įstaiga išduoda ir atnaujina sertifikatus be mokesčio — toks jos modelis. Mokate tik už patį serverį, kuriame veikia svetainė.

Ką daryti, jei certbot rašo „challenge failed“? Dažniausiai domeno A įrašas dar nenukreiptas į serverį arba uždarytas 80 prievadas. Patikrinkite DNS (dig example.com) ir ugniasienės taisykles.

Sertifikatas galioja 90 dienų — ar teks atnaujinti rankomis? Ne. Certbot įdiegia automatinio atnaujinimo laikmatį. Patikrinkite jį komanda certbot renew --dry-run — to pakanka.

Ar galima išduoti pakaitos simbolio sertifikatą (*.example.com)? Taip, bet reikės DNS-01 challenge ir jūsų DNS tiekėjo papildinio, nes HTTP patikra subdomenams netinka.

HTTPS šiandien būtinas kiekvienai svetainei: jis veikia ir vartotojų pasitikėjimą, ir reitingavimą. Svetainę su sertifikatu galite paleisti planuose puslapyje VPS serverio nuoma, o parduotuvėms ir CMS tiks WordPress VPS.

Kristaps Bērziņš