acme_certificate – Создание сертификатов SSL/TLS с протоколом ACME
Новое в версии 2.2.
Обзор
- Создание и продление сертификатов SSL/TLS с CA, поддерживающей протокол ACME, например, Let’s Encrypt. Текущая реализация поддерживает вызовы
http-01,dns-01иtls-alpn-01. - Для использования данного модуля требуется его выполнение дважды. Либо в качестве двух разных задач в одном запуске, либо в двух разных запусках. Обратите внимание, что результат первого запуска необходимо сохранить и передать во второй запуск в качестве аргумента модуля
data. - Между этими двумя задачами необходимо выполнить необходимые шаги для выбранного способа проверки, любым необходимым способом. Для
http-01это означает создание необходимого файла проверки на целевом веб-сервере. Дляdns-01необходимо создать необходимый DNS-запись. Дляtls-alpn-01необходимо создать и предоставить необходимый сертификат. Данный модуль не отвечает за выполнение этих шагов. - Для получения подробной информации о выполнении этих проверок, возможно, придётся ознакомиться с основной спецификацией ACME и спецификацией TLS-ALPN-01. Также рассмотрите примеры, предоставленные для данного модуля.
Псевдонимы: letsencrypt
Требования
Ниже приведены требования, необходимые на хосте, на котором выполняется этот модуль.
- python >= 2.6
- либо openssl, …
- … или cryptography >= 1.5
Параметры
| Параметр | Варианты/Значения по умолчанию | Комментарии |
|---|---|---|
| account_email - | Электронный адрес, связанный с этим аккаунтом. Будет использоваться для предупреждений о сроке действия сертификата. Обратите внимание, что когда modify_account не установлено в no, и вы также использовали модуль acme_account для указания более одного контакта для вашего аккаунта, этот модуль обновит ваш аккаунт и ограничит его (максимум одним) электронным адресом контакта, указанным здесь. | |
| account_key_content - добавлен в 2.5 | Содержимое ключа RSA или ключа эллиптической кривой аккаунта ACME. Взаимоисключающее с account_key_src. Требуется, если account_key_src не используется.
Предупреждение: содержимое будет записано во временный файл, который будет удален Ansible по завершении модуля. Поскольку это важный закрытый ключ — он может быть использован для изменения ключа аккаунта или для отзыва ваших сертификатов, не зная их закрытых ключей —, это может быть неприемлемо. В случае использования cryptography, содержимое не записывается во временный файл. Однако, всё равно может произойти запись на диск Ansible в процессе перемещения модуля с его аргументами на узел, где он выполняется. | |
| account_key_src - | Путь к файлу, содержащему ключ RSA или ключ эллиптической кривой аккаунта ACME. Ключи RSA могут быть созданы с помощью openssl genrsa .... Ключи эллиптической кривой могут быть созданы с помощью openssl ecparam -genkey .... Также могут быть использованы любые другие инструменты, создающие закрытые ключи в формате PEM.Взаимоисключающее с account_key_content. Требуется, если account_key_content не используется.псевдонимы: account_key | |
| account_uri - добавлен в 2.7 | Если указано, предполагается, что URI аккаунта задан как указано. Если ключ аккаунта не соответствует этому аккаунту или аккаунт с этим URI не существует, модуль завершается ошибкой. | |
| acme_directory - | Значение по умолчанию: "https://acme-staging.api.letsencrypt.org/directory" | Используемый каталог ACME. Это URL-адрес точки входа для доступа к API сервера CA. В целях безопасности значение по умолчанию установлено на сервер Let's Encrypt для разработки (для протокола ACME v1). Это создаст технически корректные, но недоверенные сертификаты. Все адреса для разработки Let's Encrypt можно найти здесь: https://letsencrypt.org/docs/staging-environment/
Для Let's Encrypt URL каталога для производства ACME v1 — https://acme-v01.api.letsencrypt.org/directory, а URL каталога для производства ACME v2 — https://acme-v02.api.letsencrypt.org/directory.
Предупреждение: На данный момент модуль протестирован только с Let's Encrypt (разработка и производство) и с тестовым сервером Pebble. |
| acme_version - добавлен в 2.5 |
| Версия ACME конечной точки. Должно быть 1 для классической конечной точки ACME Let's Encrypt или 2 для новой стандартизированной конечной точки ACME v2. |
| agreement - | URI документа об условиях использования, с которым вы соглашаетесь при использовании службы ACME v1 по адресу acme_directory. По умолчанию используется последнее значение, полученное из URL acme_directory. Этот параметр будет использоваться только при acme_version равен 1. | |
| chain_dest - добавлен в 2.5 | Если указано, промежуточный сертификат будет записан в этот файл. псевдонимы: chain | |
| challenge - |
| Выполняемый вызов. |
| csr - / обязательно | Файл, содержащий CSR для нового сертификата. Можно создать с помощью openssl req .... CSR может содержать несколько альтернативных имен субъекта, но каждое из них приведет к отдельному вызову, который необходимо выполнить для подписания CSR.
Примечание: закрытый ключ, используемый для создания CSR, не должен быть ключом аккаунта. Это плохая идея с точки зрения безопасности, и CA не должна принимать CSR. Сервер ACME должен возвращать ошибку в этом случае. псевдонимы: src | |
| data - | Данные для проверки текущих вызовов. Это необходимо указать только при повторном запуске модуля. Значение, которое нужно использовать здесь, будет предоставлено предыдущим использованием этого модуля. См. примеры для получения более подробной информации. Обратите внимание, что для ACME v2 будет использоваться только запись order_uri из data. Для ACME v1 data должно быть непустым, чтобы указать, что второй этап активен; все необходимые данные будут взяты из CSR.
Примечание: параметр data был помечен как no_log до Ansible 2.5. Начиная с Ansible 2.6, он больше не помечен таким образом, так как это делает сообщения об ошибках нечитабельными, и data не содержит никакой информации, которая могла бы быть использована без доступа к ключу аккаунта или которая не является публичной. | |
| deactivate_authzs boolean добавлен в 2.6 |
| Деактивировать объекты аутентификации (authz) после выдачи сертификата или при ошибке выдачи сертификата. Объекты аутентификации связаны с ключом аккаунта и остаются действительными в течение определенного времени и могут быть использованы для выдачи сертификатов без повторной аутентификации домена. Это может быть проблемой с точки зрения безопасности. |
| dest - | Файл назначения для сертификата. Требуется, если fullchain_dest не указан.псевдонимы: cert | |
| force boolean добавлен в 2.6 |
| Принудительно выполняет проверку вызова и валидации, даже если существующий сертификат по-прежнему действителен более чем на remaining_days.Это особенно полезно при наличии обновлённого CSR, например, с дополнительными доменами, для которых требуется новый сертификат. |
| fullchain_dest - добавлен в 2.5 | Файл назначения для полного цепочки (т.е. сертификата, после которого следует цепочка промежуточных сертификатов). Требуется, если dest не указан.псевдонимы: fullchain | |
| modify_account boolean добавлен в 2.6 |
| Булево значение, указывающее, должен ли модуль создавать аккаунт при необходимости и обновлять его контактные данные. Установите no если вы хотите использовать модуль acme_account для управления вашим аккаунтом вместо этого и для предотвращения случайного создания нового аккаунта с использованием старого ключа, если вы изменили ключ аккаунта с помощью модуля acme_account.Если установлено no, terms_agreed и account_email игнорируются. |
| remaining_days - | Значение по умолчанию: 10 | Количество оставшихся дней действия сертификата. Если cert_days < remaining_days, то он будет продлен. Если сертификат не продлен, значения модуля не будут включать challenge_data. Чтобы убедиться, что сертификат будет продлен в любом случае, вы можете использовать параметр force. |
| select_crypto_backend строка добавлен в 2.7 |
| Определяет, какой криптографический бэкенд использовать. По умолчанию используется auto, который пытается использовать cryptography при его наличии, в противном случае использует openssl. Если установлено значение openssl, будет попытка использовать openssl бинарник.Если установлено значение cryptography, будет попытка использовать библиотеку cryptography. |
| terms_agreed булево добавлен в 2.5 |
| Булево значение, указывающее, согласны ли вы с условиями обслуживания. Серверы ACME могут потребовать, чтобы это значение было true. Этот параметр будет использоваться только в случае, если acme_version не равно 1. |
| validate_certs булево добавлен в 2.5 |
| Определяет, будут ли проверяться сертификаты TLS при обращении к каталогу ACME.
Предупреждение: Данный параметр должен всегда устанавливаться в no только для целей тестирования, например, при тестировании с локальным сервером Pebble. |
Примечания
Примечание
- По крайней мере, один из
destиfullchain_destдолжен быть указан. - Этот модуль включает базовые функции управления учетной записью. Если вы хотите иметь больший контроль над своей учетной записью ACME, используйте модуль acme_account и отключите управление учетной записью для данного модуля, используя параметр
modify_account. - Этот модуль назывался
letsencryptдо Ansible 2.6. Способ использования не изменился. - Если вы хотите использовать вызов
tls-alpn-01, вы можете использовать модуль acme_challenge_cert_helper для подготовки сертификата вызова. - Вы можете использовать модуль certificate_complete_chain для поиска корневого сертификата для возвращаемой полной цепочки.
- Если доступна новая достаточно версия библиотеки
cryptography(см. Требования для подробностей), она будет использоваться вместо бинарникаopenssl. Это можно явно отключить или включить с помощью параметраselect_crypto_backend. Обратите внимание, что использование бинарникаopensslбудет медленнее и менее безопаснее, так как содержимое закрытого ключа всегда должно храниться на диске (см.account_key_content). - Хотя значения по умолчанию выбраны таким образом, чтобы модуль можно было использовать с центром сертификации Let’s Encrypt, модуль в принципе может использоваться с любым центром сертификации, предоставляющим конечную точку ACME.
Примеры
### Example with HTTP challenge ###
- name: Create a challenge for sample.com using a account key from a variable.
acme_certificate:
account_key_content: "{{ account_private_key }}"
csr: /etc/pki/cert/csr/sample.com.csr
dest: /etc/httpd/ssl/sample.com.crt
register: sample_com_challenge
# Alternative first step:
- name: Create a challenge for sample.com using a account key from hashi vault.
acme_certificate:
account_key_content: "{{ lookup('hashi_vault', 'secret=secret/account_private_key:value') }}"
csr: /etc/pki/cert/csr/sample.com.csr
fullchain_dest: /etc/httpd/ssl/sample.com-fullchain.crt
register: sample_com_challenge
# Alternative first step:
- name: Create a challenge for sample.com using a account key file.
acme_certificate:
account_key_src: /etc/pki/cert/private/account.key
csr: /etc/pki/cert/csr/sample.com.csr
dest: /etc/httpd/ssl/sample.com.crt
fullchain_dest: /etc/httpd/ssl/sample.com-fullchain.crt
register: sample_com_challenge
# perform the necessary steps to fulfill the challenge
# for example:
#
# - copy:
# dest: /var/www/html/{{ sample_com_challenge['challenge_data']['sample.com']['http-01']['resource'] }}
# content: "{{ sample_com_challenge['challenge_data']['sample.com']['http-01']['resource_value'] }}"
# when: sample_com_challenge is changed
- name: Let the challenge be validated and retrieve the cert and intermediate certificate
acme_certificate:
account_key_src: /etc/pki/cert/private/account.key
csr: /etc/pki/cert/csr/sample.com.csr
dest: /etc/httpd/ssl/sample.com.crt
fullchain_dest: /etc/httpd/ssl/sample.com-fullchain.crt
chain_dest: /etc/httpd/ssl/sample.com-intermediate.crt
data: "{{ sample_com_challenge }}"
### Example with DNS challenge against production ACME server ###
- name: Create a challenge for sample.com using a account key file.
acme_certificate:
account_key_src: /etc/pki/cert/private/account.key
account_email: myself@sample.com
src: /etc/pki/cert/csr/sample.com.csr
cert: /etc/httpd/ssl/sample.com.crt
challenge: dns-01
acme_directory: https://acme-v01.api.letsencrypt.org/directory
# Renew if the certificate is at least 30 days old
remaining_days: 60
register: sample_com_challenge
# perform the necessary steps to fulfill the challenge
# for example:
#
# - route53:
# zone: sample.com
# record: "{{ sample_com_challenge.challenge_data['sample.com']['dns-01'].record }}"
# type: TXT
# ttl: 60
# state: present
# wait: yes
# # Note: route53 requires TXT entries to be enclosed in quotes
# value: "{{ sample_com_challenge.challenge_data['sample.com']['dns-01'].resource_value | regex_replace('^(.*)$', '\"\\1\"') }}"
# when: sample_com_challenge is changed
#
# Alternative way:
#
# - route53:
# zone: sample.com
# record: "{{ item.key }}"
# type: TXT
# ttl: 60
# state: present
# wait: yes
# # Note: item.value is a list of TXT entries, and route53
# # requires every entry to be enclosed in quotes
# value: "{{ item.value | map('regex_replace', '^(.*)$', '\"\\1\"' ) | list }}"
# with_dict: sample_com_challenge.challenge_data_dns
# when: sample_com_challenge is changed
- name: Let the challenge be validated and retrieve the cert and intermediate certificate
acme_certificate:
account_key_src: /etc/pki/cert/private/account.key
account_email: myself@sample.com
src: /etc/pki/cert/csr/sample.com.csr
cert: /etc/httpd/ssl/sample.com.crt
fullchain: /etc/httpd/ssl/sample.com-fullchain.crt
chain: /etc/httpd/ssl/sample.com-intermediate.crt
challenge: dns-01
acme_directory: https://acme-v01.api.letsencrypt.org/directory
remaining_days: 60
data: "{{ sample_com_challenge }}"
when: sample_com_challenge is changed
Возвращаемые значения
Общие возвращаемые значения описаны здесь, следующие поля уникальны для данного модуля:
| Ключ | Возвращаемое значение | Описание | |
|---|---|---|---|
| account_uri строка добавлен в 2.5 | изменено | URI учетной записи ACME. | |
| authorizations сложная структура | изменено | Данные авторизации ACME. | |
| authorization словарь | успех | Объект авторизации ACME. См. https://tools.ietf.org/html/rfc8555#section-7.1.4
| |
| cert_days целое число | успех | количество дней, в течение которых действителен сертификат. | |
| challenge_data сложная структура | изменено | данные вызова по домену/типу вызова | |
| record строка добавлен в 2.5 | изменено и вызов dns-01
| полное имя DNS-записи для вызова Пример: _acme-challenge.example.com | |
| resource строка | изменено | ресурс вызова, который должен быть создан для проверки Пример: .well-known/acme-challenge/evaGxfADs6pSRb2LAv9IZf17Dt3juxGJ-PCt92wr-oA | |
| resource_value строка | изменено | Значение, которое должен генерировать ресурс для проверки. Для вызовов http-01 и dns-01 значение можно использовать непосредственно.Для вызовов tls-alpn-01 обратите внимание, что это возвращаемое значение содержит кодированную в Base64 версию правильного бинарного блока, который должен быть помещён в расширение acmeValidation x509; см. https://tools.ietf.org/html/draft-ietf-acme-tls-alpn-05#section-3 для подробностей. Для этого может потребоваться фильтр Jinja b64decode для извлечения бинарного блока из этого возвращаемого значения.Пример: IlirfxKKXA...17Dt3juxGJ-PCt92wr-oA | |
| challenge_data_dns словарь добавлен в 2.5 | изменено | список TXT-значений по DNS-записям в случае вызова dns-01
| |
| finalization_uri строка добавлен в 2.5 | изменено | URI завершения ACME. | |
| order_uri строка добавлен в 2.5 | изменено | URI заказа ACME. | |
Статус
- Интерфейс этого модуля не гарантируется обратной совместимостью. [превью]
- Этот модуль поддерживается сообществом Ansible. [сообщество]
Авторы
- Michael Gruener (@mgruener)
Подсказка
Если вы заметите какие-либо проблемы в этой документации, вы можете отредактировать этот документ для его улучшения.
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.7/modules/acme_certificate_module.html