acme: Модуль автоматического управления сертификатами (ACMEv2) для NGINX
Установка на Debian/Ubuntu
Эти документы относятся к пакету APT nginx-module-acme, предоставляемому репозиторием GetPageSpeed Extras.
- Настройте APT-репозиторий, как описано в настройке APT-репозитория.
- Установите модуль:
sudo apt-get update
sudo apt-get install nginx-module-acme
Показать дистрибутивы и архитектуры
| Distro | Suite | Component | Architectures |
|----------|-------------------|-------------|-----------------|
| debian | bookworm | main | amd64, arm64 |
| debian | bookworm-mainline | main | amd64, arm64 |
| debian | trixie | main | amd64, arm64 |
| debian | trixie-mainline | main | amd64, arm64 |
| ubuntu | focal | main | amd64, arm64 |
| ubuntu | focal-mainline | main | amd64, arm64 |
| ubuntu | jammy | main | amd64, arm64 |
| ubuntu | jammy-mainline | main | amd64, arm64 |
| ubuntu | noble | main | amd64, arm64 |
| ubuntu | noble-mainline | main | amd64, arm64 |
nginx-acme
nginx-acme это модуль NGINX, реализующий протокол автоматического управления сертификатами (ACMEv2).
Модуль реализует следующие спецификации:
- RFC8555 (Автоматическая среда управления сертификатами) с ограничениями:
- Поддерживается только тип задачи HTTP-01
- RFC8737 (Расширение ACME TLS Application-Layer Protocol Negotiation (ALPN) Challenge)
- RFC8738 (Расширение ACME IP Identifier Validation)
- draft-ietf-acme-profiles (Расширение ACME Profiles, версия 00)
Начало работы
Клонирование, настройка и сборка NGINX в ../nginx
cd nginx-acme export NGINX_BUILD_DIR=$(realpath ../nginx/objs) cargo build --release
Результат будет находиться по адресу `target/release/libnginx_acme.so`.
Другой способ - использовать предоставленный скрипт конфигурации:
```sh
## в директории исходников NGINX
auto/configure \
--with-compat \
--with-http_ssl_module \
--add-[dynamic-]module=/path/to/nginx-acme
Результат будет находиться по адресу objs/ngx_http_acme_module.so.
В настоящее время этот метод создает немного большую библиотеку, так как мы не указываем компоновщику выполнять LTO и удалять неиспользуемый код.
Тестирование
Репозиторий содержит набор тестов интеграции на основе nginx-tests. Следующая команда соберет модуль и запустит тесты:
## Путь к исходному коду nginx, по умолчанию ../nginx, если не указан.
export NGINX_SOURCE_DIR=$(realpath ../nginx)
## Путь к клону nginx-tests; по умолчанию ../nginx/tests, если не указан.
export NGINX_TESTS_DIR=$(realpath ../nginx-tests)
make test
Большинство тестов требуют бинарный файл тестового сервера pebble в пути или в
локации, указанной через переменную окружения TEST_NGINX_PEBBLE_BINARY.
Как использовать
Добавьте модуль в конфигурацию NGINX и настройте, как описано ниже.
Обратите внимание, что этот модуль требует настройки resolver в блоке http.
Пример конфигурации
resolver 127.0.0.1:53;
acme_issuer example {
uri https://acme.example.com/directory;
# contact admin@example.test;
state_path /var/cache/nginx/acme-example;
accept_terms_of_service;
}
acme_shared_zone zone=ngx_acme_shared:1M;
server {
listen 443 ssl;
server_name .example.test
192.0.2.1 # не поддерживается некоторыми ACME серверами
2001:db8::1 # не поддерживается некоторыми ACME серверами
;
acme_certificate example;
ssl_certificate $acme_certificate;
ssl_certificate_key $acme_certificate_key;
# не анализировать сертификат при каждом запросе
ssl_certificate_cache max=2;
}
server {
# слушатель на порту 80 необходим для обработки задач ACME HTTP-01
listen 80;
location / {
return 404;
}
}
Директивы
[!ВАЖНО] Справочные данные ниже отражают текущую версию разработки. См. документацию ngx_http_acme_module на nginx.org для последней выпущенной версии.
acme_issuer
Синтаксис: acme_issuer name { ... }
По умолчанию: -
Контекст: http
Определяет объект эмитента сертификата ACME.
uri
Синтаксис: uri uri
По умолчанию: -
Контекст: acme_issuer
URL директории ACME сервера. Эта директива обязательна.
account_key
Синтаксис: account_key alg[:size] | file
По умолчанию: -
Контекст: acme_issuer
Закрытый ключ аккаунта, используемый для аутентификации запроса.
Допустимые значения:
ecdsa:256/384/521для алгоритмов JSON Web SignatureES256,ES384илиES512rsa:2048/3072/4096дляRS256.- Путь к файлу для существующего ключа с использованием одного из вышеперечисленных алгоритмов.
Сгенерированные ключи аккаунта сохраняются между перезагрузками, но будут потеряны при перезапуске, если не настроен state_path.
challenge
Синтаксис: challenge type
По умолчанию: http-01
Контекст: acme_issuer
Эта директива появилась в версии 0.2.0.
Указывает тип задачи ACME, который должен использоваться для эмитента.
Допустимые значения:
http-01(http)tls-alpn-01(tls-alpn)
Задачи ACME имеют версии. Если указано безверсийное имя, модуль автоматически выбирает последнюю реализованную версию.
contact
Синтаксис: contact URL
По умолчанию: -
Контекст: acme_issuer
Устанавливает массив URL-адресов, которые ACME сервер может использовать для связи с клиентом
по вопросам аккаунта.
Схема mailto: будет использоваться, если не указано явно.
external_account_key
Синтаксис: external_account_key kid file
По умолчанию: -
Контекст: acme_issuer
Эта директива появилась в версии 0.2.0.
Указывает идентификатор ключа kid и file с MAC ключом для
внешней авторизации аккаунта.
Значение data:key может быть указано вместо file, что позволит
загрузить ключ непосредственно из конфигурации без использования промежуточных файлов.
В обоих случаях ожидается, что ключ будет закодирован в base64url.
preferred_chain
Синтаксис: preferred_chain name
По умолчанию: -
Контекст: acme_issuer
Эта директива появилась в версии 0.3.0.
Указывает предпочтительную цепочку сертификатов.
Если ACME сервер предлагает несколько цепочек сертификатов,
предпочитайте цепочку с верхним сертификатом, выданным
изолированному общему имени name.
Если совпадений нет, будет использована цепочка по умолчанию.
profile
Синтаксис: profile name [require]
По умолчанию: -
Контекст: acme_issuer
Эта директива появилась в версии 0.3.0.
Запрашивает профиль сертификата
name у ACME сервера.
Параметр require приведет к ошибке обновления сертификата
в случае, если сервер не поддерживает указанный профиль.
ssl_trusted_certificate
Синтаксис: ssl_trusted_certificate file
По умолчанию: системная CA база
Контекст: acme_issuer
Указывает file с доверенными CA сертификатами в формате PEM,
используемыми для проверки сертификата ACME сервера.
ssl_verify
Синтаксис: ssl_verify on | off
По умолчанию: on
Контекст: acme_issuer
Включает или отключает проверку сертификата ACME сервера.
state_path
Синтаксис: state_path path | off
По умолчанию: acme_<name>
Контекст: acme_issuer
Определяет директорию для хранения данных модуля, которые могут сохраняться между перезапусками. Это может улучшить время загрузки, пропуская некоторые запросы при старте, и избежать превышения лимитов на количество запросов к ACME серверу.
В директории содержится чувствительный контент, такой как ключ аккаунта, выданные сертификаты и закрытые ключи.
Параметр off (0.2.0) отключает сохранение информации об аккаунте
и выданных сертификатах на диске.
До версии 0.2.0 директория состояния не создавалась по умолчанию.
accept_terms_of_service
Синтаксис: accept_terms_of_service
По умолчанию: -
Контекст: acme_issuer
Соглашается с условиями обслуживания, под которыми будет использоваться ACME сервер. Некоторые серверы требуют принятия условий обслуживания перед регистрацией аккаунта. Условия обычно доступны на сайте ACME сервера, и URL будет напечатан в журнале ошибок, если это необходимо.
acme_shared_zone
Синтаксис: acme_shared_zone zone=name:size
По умолчанию: zone=ngx_acme_shared:256k
Контекст: http
Позволяет увеличить размер памяти хранения модуля. Зона общей памяти будет использоваться для хранения выданных сертификатов, ключей и данных о вызовах для всех настроенных эмитентов сертификатов.
Размер по умолчанию достаточно для хранения примерно 50 ключей ECDSA prime256v1 или 35 ключей RSA 2048.
acme_certificate
Синтаксис: acme_certificate issuer [identifier ...] [key=alg[:size]]
По умолчанию: -
Контекст: server
Определяет сертификат со списком identifiers, запрашиваемых у
эмитента issuer.
Явный список идентификаторов может быть пропущен. В этом случае идентификаторы будут взяты из директивы server_name в том же server блоке. Не все значения, принимаемые в server_name, являются допустимыми идентификаторами сертификатов: регулярные выражения и подстановочные знаки не поддерживаются.
Параметр key устанавливает тип сгенерированного закрытого ключа.
Поддерживаемые алгоритмы ключей и размеры:
ecdsa:256 (по умолчанию), ecdsa:384, ecdsa:521,
rsa:2048, rsa:3072, rsa:4096.
Встроенные переменные
Модуль ngx_http_acme_module поддерживает встроенные переменные, действительные в
server блоке с директивой acme_certificate:
$acme_certificate
SSL-сертификат, который можно передать в ssl_certificate.
$acme_certificate_key
Закрытый ключ SSL-сертификата, который можно передать в ssl_certificate_key.