Модуль community.crypto.acme_certificate — создание сертификатов SSL/TLS с помощью протокола ACME
Примечание
Этот модуль входит в коллекцию community.crypto (версия 3.2.1).
Возможно, эта коллекция уже установлена, если вы используете пакет ansible. Она не входит в ansible-core. Чтобы проверить, установлена ли она, выполните ansible-galaxy collection list.
Для установки используйте: ansible-galaxy collection install community.crypto. Для использования этого модуля требуются дополнительные компоненты. Подробности см. в разделе Требования.
Чтобы использовать модуль в плейбуке, укажите: community.crypto.acme_certificate.
Обзор
- Создание и обновление сертификатов SSL/TLS с помощью центра сертификации, поддерживающего протокол ACME, например Let’s Encrypt. Текущая реализация поддерживает проверки
http-01,dns-01,dns-account-01,dns-persist-01иtls-alpn-01. - Для использования этого модуля его необходимо выполнить дважды: либо в виде двух разных задач за один запуск, либо во время двух запусков. Обратите внимание: результат первого запуска необходимо сохранить и передать во второй запуск в качестве аргумента модуля
data. - Между этими двумя задачами необходимо любым способом выполнить необходимые действия для выбранной проверки. Для
http-01это означает создание необходимого файла проверки на целевом веб-сервере. Дляdns-01,dns-account-01иdns-persist-01необходимо создать соответствующие записи DNS. Дляtls-alpn-01необходимо создать и предоставить соответствующий сертификат. Выполнение этих действий не входит в обязанности этого модуля. - Чтобы узнать, как проходить эти проверки, возможно, потребуется ознакомиться с основной спецификацией ACME и спецификацией TLS-ALPN-01. Также ознакомьтесь с примерами для этого модуля.
- Модуль поддерживает IP-идентификаторы в соответствии с RFC 8738.
- Модуль экспериментально поддерживает тип проверки
dns-account-01в соответствии с черновиком acme-dns-account-label 02. Обратите внимание: поддерживаемая версия черновика может измениться в любое время, и изменения будут считаться несовместимыми только после того, как черновик получит статус RFC. - Модуль экспериментально поддерживает тип проверки
dns-persist-01в соответствии с черновиком acme-dns-persist 01. Обратите внимание: поддерживаемая версия черновика может измениться в любое время, и изменения будут считаться несовместимыми только после того, как черновик получит статус RFC.
Требования
Перечисленные ниже требования необходимы на узле, который выполняет этот модуль.
- либо
openssl - либо cryptography >= 3.3
Параметры
Параметр | Комментарии |
|---|---|
account_email string |
Он будет использоваться для предупреждений об истечении срока действия сертификата. Обратите внимание: если |
account_key_content string | Содержимое ключа учетной записи ACME RSA или ключа на эллиптических кривых. Для ключей на эллиптических кривых поддерживаются только следующие кривые: Взаимоисключающий параметр с Обязателен, если не используется Предупреждение: содержимое будет записано во временный файл, который Ansible удалит после завершения работы модуля. Поскольку это важный закрытый ключ — его можно использовать для смены ключа учетной записи или отзыва сертификатов без знания их закрытых ключей, — такой вариант может быть неприемлем. Если используется |
account_key_passphrase string добавлено в community.crypto 1.6.0 | Парольная фраза для расшифровки ключа учетной записи. Примечание: эта возможность не поддерживается модулем |
account_key_src псевдонимы: account_key path | Путь к файлу, содержащему ключ учетной записи ACME RSA или ключ на эллиптических кривых. Для ключей на эллиптических кривых поддерживаются только следующие кривые: Закрытые ключи можно создать с помощью модулей community.crypto.openssl_privatekey или community.crypto.openssl_privatekey_pipe. Если необходимая библиотека (cryptography) недоступна, ключи также можно создать непосредственно с помощью инструмента командной строки Взаимоисключающий параметр с Обязателен, если не используется |
account_uri string | Если задано, предполагается, что URI учетной записи соответствует указанному значению. Если ключ учетной записи не соответствует этой учетной записи или учетная запись с таким URI не существует, выполнение модуля завершится ошибкой. |
acme_directory string / обязательный | Каталог ACME, который следует использовать. Это URL-адрес точки входа для доступа к API сервера центра сертификации ACME. В целях безопасности по умолчанию используется тестовый сервер Let’s Encrypt (для протокола ACME v1). Он создает технически корректные, но недоверенные сертификаты. Все тестовые конечные точки Let’s Encrypt перечислены здесь: https://letsencrypt.org/docs/staging-environment/. Для Let’s Encrypt URL-адрес производственного каталога ACME v2: https://acme-v02.api.letsencrypt.org/directory. Для ZeroSSL URL-адрес производственного каталога ACME v2: https://acme.zerossl.com/v2/DV90. Для Sectigo URL-адрес производственного каталога ACME v2: https://acme-qa.secure.trust-provider.com/v2/DV. Для HARICA URL-адрес производственного каталога ACME v2: https://acme.harica.gr/XXX/directory, где XXX — значение, зависящее от учетной записи. В примечаниях к этому модулю приведен список служб ACME, с которыми он прошел тестирование. |
acme_version integer | Версия ACME конечной точки. Для стандартизированных конечных точек ACME v2 должна быть указана Значение Варианты:
|
agreement string | URI документа с условиями предоставления услуг, с которыми вы соглашаетесь при использовании службы ACME v1 на По умолчанию используется последняя версия, полученная с URL-адреса Этот параметр больше не действует. Он устарел и будет удален из community.crypto 4.0.0. |
chain_dest псевдонимы: chain path | Если задано, промежуточный сертификат будет записан в этот файл. |
challenge string | Проверка, которую необходимо выполнить. Если задано значение Поддержка Варианты:
|
csr псевдонимы: src path | Файл, содержащий запрос на сертификат (CSR) для нового сертификата. Его можно создать с помощью community.crypto.openssl_csr. CSR может содержать несколько альтернативных имен субъекта, но для каждого из них потребуется отдельная проверка, которую необходимо пройти, чтобы CSR был подписан. Примечание: закрытый ключ, использованный для создания CSR, не должен быть ключом учетной записи. С точки зрения безопасности это плохая идея, и центр сертификации не должен принимать CSR. В этом случае сервер ACME должен вернуть ошибку. Необходимо указать ровно один из параметров |
csr_content string добавлено в community.crypto 1.2.0 | Содержимое запроса на сертификат (CSR) для нового сертификата. Его можно создать с помощью community.crypto.openssl_csr_pipe. CSR может содержать несколько альтернативных имен субъекта, но для каждого из них потребуется отдельная проверка, которую необходимо пройти, чтобы CSR был подписан. Примечание: закрытый ключ, использованный для создания CSR, не должен быть ключом учетной записи. С точки зрения безопасности это плохая идея, и центр сертификации не должен принимать CSR. В этом случае сервер ACME должен вернуть ошибку. Необходимо указать ровно один из параметров |
data dictionary | Данные для проверки выполняемых проверок. Их необходимо указать только при втором запуске модуля. Значение, которое следует использовать здесь, будет предоставлено при предыдущем использовании этого модуля. Дополнительные сведения см. в примерах. Обратите внимание: для ACME v2 будет использоваться только запись Примечание: до Ansible 2.5 параметр |
deactivate_authzs boolean | Деактивировать объекты аутентификации (authz) после выдачи сертификата или в случае неудачной выдачи сертификата. Объекты аутентификации связаны с ключом учетной записи, остаются действительными в течение определенного времени и могут использоваться для выдачи сертификатов без повторной аутентификации домена. Это может представлять угрозу безопасности. Варианты:
|
dest псевдонимы: cert path | Файл назначения для сертификата. Обязателен, если не задан параметр |
force boolean | Принудительно выполняет проверку и валидацию, даже если срок действия существующего сертификата истекает более чем через Это особенно полезно при обновлении CSR, например при добавлении доменов, для которых требуется новый сертификат. Варианты:
|
fullchain_dest псевдонимы: fullchain path | Файл назначения для полной цепочки (то есть сертификата, за которым следует цепочка промежуточных сертификатов). Обязателен, если не задан параметр |
include_renewal_cert_id string добавлено в community.crypto 2.20.0 | Определяет, следует ли запрашивать продление существующего сертификата в соответствии с разделом 5 RFC 9773. Используется только в том случае, если сертификат, указанный в Как правило, следует использовать Серверы ACME могут отказаться создавать новые заказы с Если задано Варианты:
|
modify_account boolean | Логическое значение, определяющее, должен ли модуль при необходимости создавать учетную запись и обновлять ее контактные данные. Установите значение Если задано значение Текущее значение по умолчанию Варианты:
|
order_creation_error_strategy string добавлено в community.crypto 2.24.0 | Выбирает стратегию обработки ошибок протокола ACME в случае сбоя при создании нового заказа ACME. Варианты:
|
order_creation_max_retries integer добавлено в community.crypto 2.24.0 | В зависимости от стратегии, выбранной в По умолчанию: |
profile string добавлено в community.crypto 2.24.0 | Выберите профиль для сертификата. Доступные профили зависят от центра сертификации. Дополнительные сведения см. в публикации в блоге Let’s Encrypt и в документе draft-aaron-acme-profiles-01. |
remaining_days integer | Количество дней, в течение которых сертификат должен оставаться действительным. Если Чтобы гарантировать продление сертификата в любом случае, можно использовать параметр По умолчанию: |
request_timeout integer добавлено в community.crypto 2.3.0 | Время, в течение которого Ansible должен ожидать ответа от API ACME. Это время ожидания применяется ко всем HTTP(S)-запросам (HEAD, GET, POST). По умолчанию: |
retrieve_all_alternates boolean | Если задано значение Варианты:
|
select_chain list / элементы=dictionary добавлено в community.crypto 1.0.0 | Позволяет указать критерии выбора цепочки доверия (альтернативной или основной). Список критериев проверяется по очереди, пока не будет найдена цепочка, соответствующая одному из них. Если такая цепочка найдена, модуль использует ее вместо цепочки по умолчанию. Если критерию соответствуют несколько цепочек, будет возвращена первая подходящая. Порядок определяется последовательностью заголовков Каждый критерий может состоять из нескольких разных условий, таких как Этот параметр можно использовать только с модулем |
|
authority_key_identifier string |
Проверяет наличие расширения AuthorityKeyIdentifier. Это идентификатор, основанный на закрытом ключе издателя промежуточного сертификата. Идентификатор должен иметь формат |
|
issuer dictionary |
Позволяет указать части данных об издателе сертификата в цепочке, которым он должен соответствовать для выбора. Если Пример значения: |
|
subject dictionary |
Позволяет указать части данных о субъекте сертификата в цепочке, которым он должен соответствовать для выбора. Если Пример значения: |
|
subject_key_identifier string |
Проверяет наличие расширения SubjectKeyIdentifier. Это идентификатор, основанный на закрытом ключе промежуточного сертификата. Идентификатор должен иметь формат |
|
test_certificates string |
Определяет, какие сертификаты в цепочке будут проверяться.
Варианты:
|
select_crypto_backend string | Определяет, какой криптографический движок использовать. По умолчанию выбирается Если задано значение Если задано значение Варианты:
|
terms_agreed boolean | Логическое значение, указывающее, согласны ли вы с условиями предоставления услуг. Серверы ACME могут требовать, чтобы это значение было равно true. Варианты:
|
validate_certs boolean | Следует ли проверять TLS-сертификаты при обращении к каталогу ACME. Предупреждение: Значение Варианты:
|
Атрибуты
Атрибут | Поддержка | Описание |
|---|---|---|
action_group | Группы действий: community.crypto.acme, acme | Используйте |
check_mode | Поддержка: полная | Может работать в режиме |
diff_mode | Поддержка: отсутствует | В режиме diff будут возвращены сведения об изменениях (или о возможных изменениях в |
idempotent | Поддержка: частичная Если Повторный вызов модуля на втором этапе всегда идемпотентен, если не возникает ошибок. | При двух последовательных запусках вне режима проверки с одинаковыми аргументами второй вызов не сообщает об изменениях. Предполагается, что система, которой управляет модуль или к которой он обращается, не изменилась существенным образом. |
safe_file_operations | Поддержка: полная | Использует строгие функции Ansible для работы с файлами, чтобы обеспечить правильные разрешения и избежать повреждения данных. |
Примечания
Примечание
- Необходимо указать как минимум один из параметров
destиfullchain_dest. - Этот модуль включает базовые функции управления учётной записью. Чтобы управлять учётной записью ACME более гибко, используйте модуль community.crypto.acme_account и отключите управление учётной записью для этого модуля с помощью параметра
modify_account. - До Ansible 2.6 этот модуль назывался
letsencrypt. Способ его использования не изменился. - Хотя значения по умолчанию подобраны так, чтобы модуль можно было использовать с CA Let’s Encrypt, в принципе его можно использовать с любым центром сертификации, предоставляющим конечную точку ACME.
- На данный момент разработчики тестировали модули ACME только с Let’s Encrypt (тестовая и рабочая среды), ZeroSSL (рабочая среда) и тестовым сервером Pebble. Сообщество также сообщало, что модули работают с Sectigo ACME Service для InCommon и с HARICA. Если у вас возникли проблемы с другим сервером ACME, пожалуйста, создайте задачу, чтобы помочь нам обеспечить его поддержку. Мы также будем благодарны за сообщения о том, что сервер ACME, не упомянутый здесь, работает.
- Если доступна достаточно новая версия библиотеки
cryptography(подробности см. в разделе «Требования»), вместо исполняемого файлаopensslбудет использоваться эта библиотека. Это можно явно отключить или включить с помощью параметраselect_crypto_backend. Обратите внимание: использование исполняемого файлаopensslбудет медленнее и менее безопасно, так как закрытый ключ всегда приходится хранить на диске (см.account_key_content).
См. также
См. также
- Документация Let’s Encrypt
-
Документация центра сертификации Let’s Encrypt. Содержит полезные сведения, например об ограничениях частоты запросов.
- Среда автоматического управления сертификатами (ACME)
-
Спецификация протокола ACME (RFC 8555).
- Расширение ACME TLS ALPN Challenge
-
Спецификация проверки
tls-alpn-01(RFC 8737). - community.crypto.acme_challenge_cert_helper
-
Помогает подготовить проверки
tls-alpn-01. - community.crypto.openssl_privatekey
-
Можно использовать для создания закрытых ключей (как для сертификатов, так и для учётных записей).
- community.crypto.openssl_privatekey_pipe
-
Можно использовать для создания закрытых ключей без записи на диск (как для сертификатов, так и для учётных записей).
- community.crypto.openssl_csr
-
Можно использовать для создания запроса на подпись сертификата (CSR).
- community.crypto.openssl_csr_pipe
-
Можно использовать для создания запроса на подпись сертификата (CSR) без записи на диск.
- community.crypto.certificate_complete_chain
-
Позволяет найти корневой сертификат для возвращённой полной цепочки.
- community.crypto.acme_certificate_revoke
-
Позволяет отзывать сертификаты.
- community.crypto.acme_account
-
Позволяет создавать, изменять и удалять учётную запись ACME.
- community.crypto.acme_inspect
-
Позволяет отлаживать проблемы.
- community.crypto.acme_certificate_deactivate_authz
-
Позволяет деактивировать (аннулировать) заказы ACME v2.
Примеры
---
### Example with HTTP challenge ###
- name: Create a challenge for sample.com using a account key from a variable.
community.crypto.acme_certificate:
account_key_content: "{{ account_private_key }}"
csr: /etc/pki/cert/csr/sample.com.csr
dest: /etc/httpd/ssl/sample.com.crt
modify_account: false
register: sample_com_challenge
# Alternative first step:
- name: Create a challenge for sample.com using a account key from Hashi Vault.
community.crypto.acme_certificate:
account_key_content: >-
{{ lookup('community.hashi_vault.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
modify_account: false
register: sample_com_challenge
# Alternative first step:
- name: Create a challenge for sample.com using a account key file.
community.crypto.acme_certificate:
account_key_src: /etc/pki/cert/private/account.key
csr_content: "{{ lookup('file', '/etc/pki/cert/csr/sample.com.csr') }}"
dest: /etc/httpd/ssl/sample.com.crt
fullchain_dest: /etc/httpd/ssl/sample.com-fullchain.crt
modify_account: false
register: sample_com_challenge
# perform the necessary steps to fulfill the challenge
# for example:
#
# - name: Copy http-01 challenge for sample.com
# ansible.builtin.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 and 'sample.com' in sample_com_challenge['challenge_data']
#
# Alternative way:
#
# - name: Copy http-01 challenges
# ansible.builtin.copy:
# dest: /var/www/{{ item.key }}/{{ item.value['http-01']['resource'] }}
# content: "{{ item.value['http-01']['resource_value'] }}"
# loop: "{{ sample_com_challenge.challenge_data | dict2items }}"
# when: sample_com_challenge is changed
- name: Let the challenge be validated and retrieve the cert and intermediate certificate
community.crypto.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 }}"
modify_account: false
---
### Example with DNS challenge against production ACME server ###
- name: Create a challenge for sample.com using a account key file.
community.crypto.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
modify_account: false
register: sample_com_challenge
# perform the necessary steps to fulfill the challenge
# for example:
#
# - name: Create DNS record for sample.com dns-01 challenge
# community.aws.route53:
# zone: sample.com
# record: "{{ sample_com_challenge.challenge_data['sample.com']['dns-01'].record }}"
# type: TXT
# ttl: 60
# state: present
# wait: true
# # Note: route53 requires TXT entries to be enclosed in quotes
# value: "{{ sample_com_challenge.challenge_data['sample.com']['dns-01'].resource_value | community.dns.quote_txt(always_quote=true) }}"
# when: sample_com_challenge is changed and 'sample.com' in sample_com_challenge.challenge_data
#
# Alternative way:
#
# - name: Create DNS records for dns-01 challenges
# community.aws.route53:
# zone: sample.com
# record: "{{ item.key }}"
# type: TXT
# ttl: 60
# state: present
# wait: true
# # Note: item.value is a list of TXT entries, and route53
# # requires every entry to be enclosed in quotes
# value: "{{ item.value | map('community.dns.quote_txt', always_quote=true) | list }}"
# loop: "{{ sample_com_challenge.challenge_data_dns | dict2items }}"
# when: sample_com_challenge is changed
- name: Let the challenge be validated and retrieve the cert and intermediate certificate
community.crypto.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 }}"
modify_account: false
when: sample_com_challenge is changed
# Alternative second step:
- name: Let the challenge be validated and retrieve the cert and intermediate certificate
community.crypto.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: tls-alpn-01
remaining_days: 60
data: "{{ sample_com_challenge }}"
# We use Let's Encrypt's ACME v2 endpoint
acme_directory: https://acme-v02.api.letsencrypt.org/directory
# The following makes sure that if a chain with /CN=DST Root CA X3 in its issuer is provided
# as an alternative, it will be selected. These are the roots cross-signed by IdenTrust.
# As long as Let's Encrypt provides alternate chains with the cross-signed root(s) when
# switching to their own ISRG Root X1 root, this will use the chain ending with a cross-signed
# root. This chain is more compatible with older TLS clients.
select_chain:
- test_certificates: last
issuer:
CN: DST Root CA X3
O: Digital Signature Trust Co.
modify_account: false
when: sample_com_challenge is changed
Возвращаемые значения
Общие возвращаемые значения описаны здесь; ниже перечислены поля, относящиеся только к этому модулю:
Ключ | Описание |
|---|---|
account_uri string | URI учётной записи ACME. Возвращается: changed |
all_chains list / elements=dictionary | Если для Подробнее см. раздел 7.4.2 RFC 8555. Возвращается: если сертификат получен и для |
|
cert string |
Сам конечный сертификат в формате PEM. Возвращается: всегда |
|
chain string |
Цепочка сертификатов без корневого сертификата, представленная объединёнными сертификатами PEM. Возвращается: всегда |
|
full_chain string |
Цепочка сертификатов без корневого сертификата, но с конечным сертификатом, представленная объединёнными сертификатами PEM. Возвращается: всегда |
authorizations dictionary | Данные авторизации ACME. Сопоставляет идентификатор с объектами авторизации ACME. См. https://tools.ietf.org/html/rfc8555#section-7.1.4. Возвращается: changed Пример: |
cert_days integer | Количество дней, в течение которых сертификат остаётся действительным. Возвращается: при успешном выполнении |
challenge_data dictionary | Данные проверки для каждой пары «идентификатор / тип проверки». Начиная с Ansible 2.8.5 возвращаются только проверки, которые ещё не действительны. Возвращается: changed |
|
identifier dictionary |
Для каждого идентификатора предоставляет словарь типов проверок, сопоставленных с данными проверок. Ключами этого словаря являются идентификаторы. Обратите внимание, что эти ключи не являются допустимыми идентификаторами Jinja2. Возвращается: changed |
|
challenge-type dictionary |
Данные для каждого типа проверки. Ключами этого словаря являются типы проверок. Обратите внимание, что эти ключи не являются допустимыми идентификаторами Jinja2. Обратите внимание: это возвращаемое значение для проверок Возвращается: changed |
|
account_uri string |
URI учётной записи, который необходимо указать в записи DNS TXT. Обратите внимание: тип этого возвращаемого значения может измениться с нарушением обратной совместимости даже в минорных выпусках, пока черновик acme-dns-persist не перейдёт в более стабильное состояние. Это поле проверки в настоящее время обсуждается в рабочей группе ACME. Возвращается: при изменении, если проверка — Пример: |
|
issuer_domain_names list / elements=string |
Одно из доменных имён издателя необходимо указать в записи DNS TXT. Возвращается: при изменении, если проверка — Пример: |
|
record string |
Полное имя DNS-записи для проверки. Возвращается: при изменении, если тип проверки — Пример: |
|
resource string |
Ресурс проверки, который необходимо создать для проверки подлинности. Возвращается: при изменении, если тип проверки не Пример: |
|
resource_original string |
Исходный ресурс проверки, включая идентификатор типа для проверок Возвращается: при изменении, если Пример: |
|
resource_value string |
Значение, которое должен выдавать ресурс для прохождения проверки. Для проверок Для проверок Возвращается: при изменении, если тип проверки не Пример: |
challenge_data_dns dictionary | Список значений TXT для каждой записи DNS, если тип проверки — Начиная с Ansible 2.8.5 возвращаются только проверки, которые ещё не действительны. Возвращается: changed |
finalization_uri string | URI финализации ACME. Возвращается: changed |
order_uri string | URI заказа ACME. Возвращается: changed |
Ссылки на коллекцию
© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/projects/ansible/latest/collections/community/crypto/acme_certificate_module.html