До основного вмісту

Встановлення SSL на Nginx за допомогою Certbot

VDS / VPS · 22.02.2025 · 4 хв читання
Ілюстрація до статті «Встановлення SSL на Nginx за допомогою Certbot»

Certbot — офіційний клієнт Let's Encrypt, який отримує безкоштовний TLS-сертифікат і сам виправляє конфігурацію Nginx під HTTPS. На VDS це стандартний спосіб закрити сайт замком в адресному рядку без купівлі сертифіката.

Certbot — безкоштовний SSL для Nginx

Let's Encrypt випускає сертифікати строком на 90 днів і підтверджує володіння доменом одним зі способів валідації: за HTTP (файл на сайті) або за DNS (TXT-запис). Плагін python3-certbot-nginx використовує HTTP-валідацію і сам додає блоки listen 443 ssl у конфіг.

Встановлення Certbot

На Ubuntu 20.04+ і Debian 11+ пакет уже у стандартному репозиторії, окремий PPA не потрібен:

apt update
apt install certbot python3-certbot-nginx -y

# Перевірити версію
certbot --version

Отримання сертифіката

Плагін nginx сам знаходить потрібний server_name у конфігурації і додає туди SSL-блок:

certbot --nginx -d yourdomain.com -d www.yourdomain.com

Якщо Nginx ще не налаштовано або сертифікат потрібен окремо від правки конфіга — наприклад, для перевірки перед бойовим перемиканням, — використовується режим certonly з коренем сайту:

certbot certonly --webroot -w /var/www/yourdomain.com -d yourdomain.com -d www.yourdomain.com

У цьому разі сертифікат лягає у /etc/letsencrypt/live/yourdomain.com/, а шляхи до fullchain.pem і privkey.pem потрібно прописати у server-блоці вручну.

Автопродовження

Certbot встановлює systemd-таймер, який двічі на день перевіряє термін дії і продовжує сертифікати, яким лишилося менше 30 днів:

systemctl status certbot.timer
systemctl list-timers | grep certbot

Продовження не вимагає повторного введення домену і не чіпає решту конфігурації Nginx — оновлюються лише файли у /etc/letsencrypt/live/, сам Nginx перечитує їх після reload, який certbot виконує автоматично через deploy-hook.

Примусова перевірка продовження

# Тестовий прогін без реального продовження
certbot renew --dry-run

# Журнал минулих спроб
cat /var/log/letsencrypt/letsencrypt.log

Порівняння способів отримання SSL

СпосібВалідаціяWildcard-домениВартість і термін
Certbot + nginx-плагінHTTP-01, автоматичноНіБезкоштовно, 90 днів, автопродовження
Certbot + DNS-плагінDNS-01, через API DNS-провайдераТакБезкоштовно, 90 днів, автопродовження
Certbot certonly --webrootHTTP-01, без правки NginxНіБезкоштовно, 90 днів
Платний сертифікат (OV/EV)Перевірка організації вручнуЗазвичай такПлатно, 1–2 роки

Для wildcard-сертифіката на *.yourdomain.com потрібна DNS-валідація, бо підтвердити володіння одразу всіма можливими піддоменами через HTTP неможливо — детальний процес описано в статті про wildcard-сертифікати через Certbot.

Розбір типових помилок

Помилка Could not bind TCP port 80 because it is already in use з'являється, коли certbot у режимі standalone намагається сам підняти тимчасовий вебсервер на 80-му порту, а Nginx уже його займає. Рішення — використовувати плагін --nginx або --webroot замість standalone, вони працюють через уже запущений сервер, а не замість нього.

Failed authorization procedure. yourdomain.com (http-01): urn:ietf:params:acme:error:connection ::
Fetching http://yourdomain.com/.well-known/acme-challenge/xxx: Connection refused

Ця помилка майже завжди означає, що порт 80 закрито файрволом або DNS-запис домену ще не вказує на поточний сервер. Перевірте ufw status і результат dig yourdomain.com +short перед повторною спробою.

Ліміт too many certificates already issued — у Let's Encrypt діє обмеження: не більше 5 однакових сертифікатів на один точний набір доменів за 7 днів і 50 сертифікатів на зареєстрований домен за тиждень. Його ловлять тестами через staging-середовище — додайте --staging до команди, щоб налагодити процес, не витрачаючи ліміт бойових сертифікатів.

Ручна перевірка сертифіката

Після видачі варто перевірити сертифікат незалежно від Certbot, очима клієнта:

# Термін дії та видавець
openssl x509 -in /etc/letsencrypt/live/yourdomain.com/cert.pem -noout -dates -issuer

# Повний ланцюжок так, як його бачить браузер
curl -vI https://yourdomain.com 2>&1 | grep -i "SSL certificate"

Коли Certbot не підходить

  • Домен без публічного DNS-запису (внутрішній хост, тестовий стенд за VPN) — HTTP-01 валідація не пройде, потрібен самопідписаний сертифікат або внутрішній CA.
  • Сайт повністю проксується через Cloudflare в режимі Full (strict) — тоді сертифікат потрібен або від Cloudflare Origin CA, або той самий Let's Encrypt, але з DNS-01 через API Cloudflare, а не HTTP-01 напряму.
  • Декілька серверів за балансувальником навантаження вимагають синхронізації сертифіката між вузлами — Certbot сам цим не займається, потрібне спільне сховище або окремий вузол-видавець.
  • Юридичним особам іноді потрібен сертифікат із перевіркою організації (OV/EV) для відповідності вимогам партнерів — Let's Encrypt такі не видає в принципі, лише DV.

Перевірка результату

  1. Відкрийте сайт за https:// у браузері — адресний рядок має показувати закритий замок без попереджень.
  2. Перевірте редирект з HTTP на HTTPS: curl -I http://yourdomain.com має повернути 301 або 308 на https-адресу.
  3. Перевірте таймер автопродовження: systemctl is-enabled certbot.timer має повернути enabled.
  4. Через зовнішній сервіс перевірки TLS переконайтеся, що віддається повний ланцюжок сертифікатів, а не лише сам сертифікат домену — частина браузерів підставить проміжний сертифікат сама, але не всі.

Якщо після встановлення сертифіката потрібно донастроїти сам HTTPS-блок Nginx — протоколи, шифри, HSTS, — це окрема тема в статті про налаштування Nginx для сайту на VDS.

Чи була стаття корисною?
← Назад до бази знань Поставити питання підтримці