SSL-сертификаты: ACME и Certbot — подробное руководство для Linux и Nginx

Сегодня HTTPS стал стандартом для любого сайта. Без SSL-сертификата браузеры помечают сайт как небезопасный, а многие API, VPN и современные сервисы вообще отказываются работать по HTTP.
В этой статье разберём:
- что такое SSL/TLS;
- что такое ACME;
- как работает Certbot;
- где лежат сертификаты в Linux;
- как автоматически продлевать сертификаты;
- как подключить SSL к Nginx;
- чем отличаются standalone, webroot и DNS-проверка;
- типичные ошибки и советы по безопасности.
Что такое SSL и TLS
Раньше использовался протокол SSL (Secure Sockets Layer), но сейчас актуален TLS (Transport Layer Security). Однако название «SSL-сертификат» осталось привычным.
SSL/TLS обеспечивает:
- шифрование трафика;
- защиту от перехвата данных;
- подтверждение владения доменом;
- HTTPS в браузере.
Когда вы заходите на сайт по HTTPS:
https://example.com
браузер проверяет сертификат сервера и создаёт защищённое соединение.
Что такое ACME
Let’s Encrypt использует протокол ACME.
ACME (Automatic Certificate Management Environment) — это протокол автоматического получения и продления SSL-сертификатов.
Благодаря ACME сервер может:
- автоматически запросить сертификат;
- подтвердить владение доменом;
- установить сертификат;
- автоматически продлевать его.
Без ACME всё пришлось бы делать вручную.
Что такое Certbot
Certbot — самый популярный ACME-клиент для Linux.
Официальный сайт:
Он умеет:
- получать сертификаты;
- автоматически настраивать Nginx и Apache;
- продлевать сертификаты;
- работать через HTTP или DNS;
- обновлять конфигурацию веб-сервера.
Как работает получение сертификата
Схема работы простая:
- Certbot обращается к Let’s Encrypt.
- Let’s Encrypt просит подтвердить владение доменом.
- Сервер размещает временный файл.
- Центр сертификации проверяет доступность файла.
- Если всё успешно — выдаётся сертификат.
Способы проверки домена
1. HTTP-01 (самый популярный)
Certbot создаёт временный файл:
http://example.com/.well-known/acme-challenge/
Let’s Encrypt проверяет его наличие.
Плюсы:
- просто;
- подходит для большинства сайтов.
Минусы:
- нужен открытый 80 порт;
- домен должен указывать на сервер.
2. Standalone
Certbot сам временно запускает веб-сервер.
Команда:
sudo certbot certonly --standalone -d example.com
Плюсы:
- не нужен Nginx.
Минусы:
- Nginx надо остановить;
- порт 80 должен быть свободен.
3. Webroot
Certbot кладёт файл в папку сайта.
Пример:
sudo certbot certonly --webroot -w /var/www/site -d example.com
Это один из лучших вариантов для Nginx.
4. DNS-01
Подтверждение через DNS TXT-запись.
Используется:
- для wildcard сертификатов;
- если порт 80 закрыт;
- для внутренних сервисов.
Пример wildcard:
*.example.com
Установка Certbot в Ubuntu
Для Ubuntu 22:
sudo apt update
sudo apt install certbot python3-certbot-nginx
Для Nginx нужен модуль:
python3-certbot-nginx
Получение сертификата для Nginx
Пример:
sudo certbot --nginx -d example.com -d www.example.com
Certbot:
- получит сертификат;
- автоматически изменит конфиг Nginx;
- включит HTTPS;
- настроит redirect HTTP → HTTPS.
Где лежат SSL-сертификаты
Основная папка:
/etc/letsencrypt/
Структура:
/etc/letsencrypt/
├── live/
├── archive/
├── renewal/
Папка live
Самая важная папка.
Пример:
/etc/letsencrypt/live/example.com/
Там лежат символические ссылки:
cert.pem
chain.pem
fullchain.pem
privkey.pem
Что означают файлы
cert.pem
Сертификат домена.
chain.pem
Цепочка промежуточных сертификатов.
fullchain.pem
Основной файл для Nginx.
Содержит:
- сертификат сайта;
- промежуточные сертификаты.
privkey.pem
Приватный ключ.
Самый важный файл.
Никому нельзя передавать.
Где лежат реальные файлы
Настоящие файлы лежат здесь:
/etc/letsencrypt/archive/example.com/
А папка live содержит только symlink-ссылки.
Конфигурация Nginx с SSL
Пример:
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
root /var/www/site;
}
HTTP → HTTPS redirect
Пример:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
Автоматическое продление сертификатов
Let’s Encrypt выдаёт сертификаты на 90 дней.
Certbot обычно автоматически создаёт:
- systemd timer;
- cron-задачу.
Проверить можно так:
systemctl list-timers
Проверка продления
Тест:
sudo certbot renew --dry-run
Если всё хорошо:
Congratulations, all simulated renewals succeeded
Где лежат настройки продления
Файлы:
/etc/letsencrypt/renewal/
Например:
/etc/letsencrypt/renewal/example.com.conf
Проверка сертификата
Проверить сертификат сайта:
openssl x509 -in cert.pem -text -noout
Проверить HTTPS:
curl -Iv https://example.com
Проверка сроков действия
Команда:
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
Wildcard сертификаты
Wildcard позволяет использовать:
*.example.com
для всех поддоменов.
Например:
- cdn.example.com
- api.example.com
- vpn.example.com
Получение:
sudo certbot certonly --manual --preferred-challenges dns -d "*.example.com"
Безопасность SSL
Не открывайте privkey.pem
Никогда не публикуйте:
privkey.pem
Делайте резервные копии
Важно сохранять:
/etc/letsencrypt/
Проверяйте права
Пример:
ls -la /etc/letsencrypt/live/example.com/
Частые ошибки
1. Порт 80 закрыт
Let’s Encrypt не сможет проверить домен.
Проверьте:
sudo ss -tulpn | grep :80
2. DNS ещё не обновился
Проверьте:
dig example.com
3. Nginx занимает порт при standalone
Нужно остановить:
sudo systemctl stop nginx
4. Неверный server_name
Проверьте конфиг Nginx.
Certbot или acme.sh?
Кроме Certbot существует:
acme.sh
Официальный сайт:
Certbot
Плюсы:
- очень популярен;
- отлично работает с Nginx;
- официальный клиент;
- простая автоматизация.
Минусы:
- тяжелее;
- зависит от Python.
acme.sh
Плюсы:
- лёгкий shell-скрипт;
- минимальные зависимости;
- удобно для VPS и VPN.
Минусы:
- больше ручной настройки;
- менее удобно новичкам.
Что лучше использовать
Для обычного сайта
Лучше:
Certbot + Nginx plugin
Для VPN и нестандартных конфигураций
Часто удобнее:
acme.sh
Особенно для:
- Xray;
- VLESS;
- 3X-UI;
- CDN-доменов;
- wildcard-сертификатов.
Полезные команды
Получить сертификат:
sudo certbot --nginx -d example.com
Продлить:
sudo certbot renew
Проверка:
sudo certbot renew --dry-run
Список сертификатов:
sudo certbot certificates
Удалить сертификат:
sudo certbot delete --cert-name example.com
Заключение
ACME полностью изменил работу с SSL-сертификатами. Раньше настройка HTTPS была сложной и платной, а сейчас Certbot позволяет получить и автоматически продлевать сертификаты буквально одной командой.
Для большинства серверов на Ubuntu и Nginx оптимальная схема выглядит так:
Nginx + Certbot + Let's Encrypt
Она обеспечивает:
- бесплатный HTTPS;
- автоматическое продление;
- высокую безопасность;
- совместимость со всеми современными браузерами и сервисами.
