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 --webroot | HTTP-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.
Перевірка результату
- Відкрийте сайт за
https://у браузері — адресний рядок має показувати закритий замок без попереджень. - Перевірте редирект з HTTP на HTTPS:
curl -I http://yourdomain.comмає повернути301або308на https-адресу. - Перевірте таймер автопродовження:
systemctl is-enabled certbot.timerмає повернутиenabled. - Через зовнішній сервіс перевірки TLS переконайтеся, що віддається повний ланцюжок сертифікатів, а не лише сам сертифікат домену — частина браузерів підставить проміжний сертифікат сама, але не всі.
Якщо після встановлення сертифіката потрібно донастроїти сам HTTPS-блок Nginx — протоколи, шифри, HSTS, — це окрема тема в статті про налаштування Nginx для сайту на VDS.