acme: Автоматическое управление сертификатами (модуль ACMEv2) для NGINX
Установка на Debian/Ubuntu
Эти документы применимы к пакету APT nginx-module-acme, предоставляемому репозиторием GetPageSpeed Extras.
- Настройте APT-репозиторий, как описано в настройке APT-репозитория.
- Установите модуль:
sudo apt-get update
sudo apt-get install nginx-module-acme
Warning
Этот модуль еще не опубликован как nginx-module-acme в репозиториях APT. Следите за новостями или напишите на support@getpagespeed.com, чтобы запросить его.
nginx-acme
nginx-acme это модуль NGINX с реализацией протокола автоматического управления сертификатами (ACMEv2).
Модуль реализует следующие спецификации:
- RFC8555 (Автоматическая среда управления сертификатами) с ограничениями:
- Поддерживается только тип вызова HTTP-01
- RFC8737 (Расширение ACME для TLS Протокола Переговоров уровня приложений (ALPN))
- RFC8738 (Расширение проверки идентификаторов IP ACME)
- draft-ietf-acme-profiles (Расширение профилей ACME, версия 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, который будет использоваться для issuer.
Допустимые значения:
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-ключом для
внешней авторизации аккаунта.
Вместо file можно указать значение data:key, которое загружает
ключ непосредственно из конфигурации без использования промежуточных файлов.
В обоих случаях предполагается, что ключ закодирован в base64url.
preferred_chain
Синтаксис: preferred_chain name
По умолчанию: -
Контекст: acme_issuer
Эта директива появилась в версии 0.3.0.
Указывает предпочтительную цепочку сертификатов.
Если сервер ACME предлагает несколько цепочек сертификатов,
предпочитайте цепочку с верхним сертификатом, выданным от
Subject Common Name 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.