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

ROBOTDAY

Сегодня 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.

Официальный сайт:

Certbot

Он умеет:

  • получать сертификаты;
  • автоматически настраивать Nginx и Apache;
  • продлевать сертификаты;
  • работать через HTTP или DNS;
  • обновлять конфигурацию веб-сервера.

Как работает получение сертификата

Схема работы простая:

  1. Certbot обращается к Let’s Encrypt.
  2. Let’s Encrypt просит подтвердить владение доменом.
  3. Сервер размещает временный файл.
  4. Центр сертификации проверяет доступность файла.
  5. Если всё успешно — выдаётся сертификат.

Способы проверки домена

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

Официальный сайт:

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;
  • автоматическое продление;
  • высокую безопасность;
  • совместимость со всеми современными браузерами и сервисами.