SSL-сертификат на VPS бесплатно: Nginx, Let's Encrypt и certbot
Чтобы бесплатно получить SSL-сертификат для Nginx на VPS, установите certbot с плагином для Nginx и выполните certbot --nginx -d example.com -d www.example.com --redirect. Certbot выпустит сертификат Let's Encrypt, пропишет его в конфигурацию Nginx и настроит перенаправление с HTTP на HTTPS, а таймер systemd будет продлевать его автоматически. Инструкция подходит для Ubuntu 24.04 и Debian 12.
Что понадобится
- VPS с Ubuntu 24.04 или Debian 12. Обе системы есть среди образов, которые можно выбрать при заказе или переустановить из личного кабинета. Nginx и certbot почти не расходуют память, поэтому статический сайт, реверс-прокси или приложение с небольшой базой данных спокойно работают на Pulse (2 vCPU, 2 ГБ RAM, $10 в месяц).
- Домен, направленный на сервер. A-запись для
example.comи запись дляwwwуже должны указывать на IP сервера, иначе Let's Encrypt не сможет проверить домен. Подробнее — как привязать домен к VPS. - Root-доступ по SSH. См. подключение по SSH.
1. Установите Nginx
apt update && apt install -y nginx
Если используете ufw, откройте HTTP и HTTPS. Порт 80 должен оставаться открытым: по нему Let's Encrypt проверяет домен при каждом продлении.
ufw allow 80/tcp
ufw allow 443/tcp
2. Создайте server-блок
Создайте файл /etc/nginx/sites-available/example.com (замените example.com своим доменом):
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Добавьте тестовую страницу, включите сайт и перезагрузите Nginx:
mkdir -p /var/www/example.com
echo "It works" > /var/www/example.com/index.html
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
curl -I http://example.com
curl должен вернуть HTTP/1.1 200 OK. Строка server_name важна: по ней certbot находит блок, который нужно изменить.
3. Установите certbot
apt install -y certbot python3-certbot-nginx
4. Получите сертификат и включите редирект
certbot --nginx -d example.com -d www.example.com --redirect
При первом запуске certbot спросит адрес электронной почты и попросит принять условия Let's Encrypt. Затем он проверит домен по HTTP, сохранит сертификат в /etc/letsencrypt/live/example.com/, добавит listen 443 ssl в ваш server-блок и создаст перенаправление с HTTP на HTTPS.
Проверьте результат:
curl -I http://example.com
curl -I https://example.com
Первая команда должна вернуть 301 Moved Permanently с Location: https://example.com/, вторая — 200 OK.
5. Проверьте автоматическое продление
Сертификаты Let's Encrypt живут недолго (не больше 90 дней), поэтому продление должно идти само. Пакет в Debian и Ubuntu ставит таймер systemd, который запускается дважды в сутки и продлевает сертификаты, срок которых подходит к концу. Убедитесь, что таймер активен и продление действительно работает:
systemctl list-timers certbot.timer
certbot renew --dry-run
certbot certificates
--dry-run проходит всё продление в тестовой среде Let's Encrypt, не заменяя сертификат. После настоящего продления плагин сам перезагружает Nginx, дополнительные хуки не нужны.
Частые ошибки
Timeout during connectилиunauthorized. Домен ещё не указывает на этот сервер, или закрыт порт 80. Проверьтеdig +short example.comи настройки файрвола.Could not automatically find a matching server block. Вserver_nameнет домена, переданного через-d. Исправьте конфигурацию, выполнитеnginx -tи запустите certbot снова.- Не проходит проверка
www. Дляwwwнет DNS-записи. Добавьте её или уберите-d www.example.com. - Слишком много неудачных попыток. Let's Encrypt ограничивает число неудачных проверок в час. Сначала устраните причину, а для проверки используйте
certbot renew --dry-runвместо повторного настоящего запроса.