Пост

Настройка HTTPS с Let's Encrypt и Nginx c ngx_http_acme_module

Пошаговое руководство по настройке бесплатного HTTPS-сертификата от Let's Encrypt с использованием модуля ngx_http_acme_module для Nginx. Автоматизируйте обновление и обеспечьте безопасность вашего сайта.

Настройка HTTPS с Let's Encrypt и Nginx c ngx_http_acme_module

Салют, $USER!
Эй, кстати, наш Telegram уже ждёт именно тебя. Забегай!

Это должна была быть первая статья в моем блоге. И решил написать ее о том, как использовать модуль ngx_http_acme для nginx. 15 августа 2025 года появилась новость о том, что компания F5 выпустила модуль для nginx, который позволяет упростить и автоматизировать работу с ssl сертификатами, а в частности с сертификатами letsencrypt. Это дает то, что мы теперь можем выпускать сертификаты прямо в конфигурационных файлах nginx и не надо ставить certbot, и другие решение для выпуска сертификатов.

Ограничения

  • Поддерживается только HTTP-01 challenge (требует 80 порт).
  • Нет поддержки TLS-ALPN и DNS-01 (в том числе для wildcard-сертификатов) — пока в планах.
  • Регулярные выражения и подстановки в server_name недоступны.

Ну что, приступим к установке.

Установка.

Модуль ngx_http_acme пока еще нет в репозиториях дистрибутивов, но он есть в opensorce репозитории самого nginx в ветки stable, мы его и подключим.
Вся установка и настройка будут выполняться в дистрибутиве Ubuntu-24.04 от пользователя root. [мне так проще]

Подключаем репозиторий.

  • По классике обновим кеш пакетов.
1
apt update
  • Установим недостающие пакеты.
1
apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
  • Импортируем ключ.
1
2
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
  • Проверим ключ.
1
gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
  • Подключаем сам репозиторий, я выбрал stable ветку.
1
2
3
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
https://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
  • Ну и закрепим репозиторий.

Это нужно для того, чтобы nginx установился из репозитория самого nginx, а не системного репозитория.

1
2
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
  • Или возпользуемся скриптом для ubuntu/debian.
1
curl https://code.1xtier.ru/floki/scripts/raw/branch/main/service/nginx/ins_repo-nginx.sh | bash
  • Обновим кеш, чтобы репозиторий у нас подтянулся.
1
apt update
  • Устанавливаем сам nginx и модуль ngx_http_acme.
1
apt install nginx nginx-module-acme

Настройка модуля ngx_http_acme.

  • Проверим что модуль установился.
1
2
3
ls /etc/nginx/modules | grep acme
    ngx_http_acme_module-debug.so
    ngx_http_acme_module.so
  • Подключаем модуль acme в главном конфиге nginx.
    Модуль подключаем до блока http и блока events.
1
load_module modules/ngx_http_acme_module.so;

Вверху всего конфигурационного файла вставляем следующее.

1
2
3
4
5
6
7
8
9
resolver 8.8.8.8;
acme_issuer letsencrypt {
    uri https://acme-v02.api.letsencrypt.org/directory;
    contact тут ваш email
    state_path /var/cache/nginx/acme-letsencrypt;
    accept_terms_of_service;
    
}
acme_shared_zone zone=ngx_acme_shared:1M;
  • Далее идем в блок server настроек ssl подключения и пропишем следующее:
1
2
3
4
5
6
7
8
9
10
11
12
listen 443 ssl;
server_name domain.ru

    acme_certificate letsencrypt;
    ssl_certificate $acme_certificate;
    ssl_certificate_key $acme_certificate_key;
    ssl_certificate_cache max=2;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers off;
далее настраивате под свои нужны блоки nginx

После настройки сохраняем и выходим и проверяем конфигураю nginx -t и перезагружаем nginx.

1
systemctl restart nginx

Немного подождем и проверяем, получил ли у нас nginx ssl сертификат:

  • Либо идем в браузер и по https://.
  • Посмотрим содержимое директории ls -la /var/cache/nginx/acme-letsencrypt. Как видим сертификаты подтянулись.
1
1xtier.ru-a475552253811764.crt 1xtier.ru-a475552253811764.key account.key account.url

PS.

Если нужно получить SSL-сертификат для поддомена или другого домена на том же сервере, это будет немного проще. Мы просто в настройках блока server в разделе https указываем необходимые данные.

1
2
3
4
5
6
7
8
9
10
11
12
13
listen 443 ssl;
server_name domain.ru
    server_name code.1xtier.ru;
    acme_certificate letsencrypt;
    ssl_certificate $acme_certificate;
    ssl_certificate_key $acme_certificate_key;
    ssl_certificate_cache max=2;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers off;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;

Без блока настройки acme_issuer letsencrypt проверяем конфигурацию и перезагружаем nginx, проверяем сертификат:

  • Либо идем в браузер и по https://
  • посмотрим содержимое директории ls -la /var/cache/nginx/acme-letsencrypt и видим два сертификата для нашего поддомена.
1
code.1xtier.ru-df7cfb7ec5461350.crt code.1xtier.ru-df7cfb7ec5461350.key
Авторский пост защищен лицензией CC BY 4.0 .

Популярные теги