Модуль community.crypto.acme_certificate – Создание сертификатов SSL/TLS с использованием протокола ACME
Примечание
Этот модуль является частью коллекции community.crypto (версия 2.22.1).
Возможно, эта коллекция уже установлена, если вы используете пакет ansible. Она не включена в ansible-core. Чтобы проверить, установлена ли она, выполните ansible-galaxy collection list.
Для установки используйте: ansible-galaxy collection install community.crypto. Для использования этого модуля вам потребуются дополнительные требования, см. Требования для получения подробной информации.
Для использования в playbook, укажите: community.crypto.acme_certificate.
Краткое описание
- Создание и обновление сертификатов SSL/TLS с помощью центра сертификации, поддерживающего протокол ACME, например, Let’s Encrypt или Buypass. Текущая реализация поддерживает
http-01,dns-01иtls-alpn-01задачи проверки. - Для использования этого модуля его необходимо выполнить дважды. Либо как две разные задачи в одном запуске, либо во время двух запусков. Обратите внимание, что вывод первого запуска необходимо записать и передать во второй запуск как аргумент модуля
data. - Между этими двумя задачами необходимо выполнить необходимые шаги для выбранной задачи проверки любыми необходимыми способами. Для
http-01это означает создание необходимого файла проверки на целевом веб-сервере. Дляdns-01необходимо создать необходимую DNS-запись. Дляtls-alpn-01необходимо создать и обслуживать необходимый сертификат. Выполнение этих шагов не является обязанностью этого модуля. - Для получения подробной информации о выполнении этих задач проверки, вам может потребоваться ознакомиться с основной спецификацией ACME и спецификацией TLS-ALPN-01. Также обратите внимание на примеры, приведенные для этого модуля.
- Модуль включает экспериментальную поддержку идентификаторов IP в соответствии с RFC 8738.
Требования
Приведенные ниже требования необходимы на хосте, который выполняет этот модуль.
- либо openssl, либо cryptography >= 1.5
- ipaddress
Параметры
Параметр | Комментарии |
|---|---|
account_email string | Адрес электронной почты, связанный с этой учетной записью. Он будет использоваться для предупреждений о истечении срока действия сертификата. Обратите внимание, что когда |
account_key_content string | Содержимое ключа ACME account RSA или ключа эллиптической кривой. Взаимоисключающе с Обязательно, если не используется Предупреждение: содержимое будет записано во временный файл, который будет удален Ansible по завершении работы модуля. Поскольку это важный закрытый ключ — его можно использовать для изменения ключа учетной записи или для отзыва ваших сертификатов без знания их закрытых ключей —, это может быть неприемлемо. В случае использования |
account_key_passphrase string добавлено в community.crypto 1.6.0 | Пароль для декодирования ключа учетной записи. Примечание: это не поддерживается бекендом |
account_key_src aliases: account_key path | Путь к файлу, содержащему ключ ACME account RSA или ключ эллиптической кривой. Закрытые ключи могут быть созданы с помощью модулей community.crypto.openssl_privatekey или community.crypto.openssl_privatekey_pipe. Если необходимый (cryptography) недоступен, ключи также могут быть созданы непосредственно с помощью командной строки Взаимоисключающе с Обязательно, если не используется |
account_uri string | Если указано, предполагается, что URI учетной записи указан. Если ключ учетной записи не соответствует этой учетной записи или учетная запись с этим URI не существует, модуль завершается ошибкой. |
acme_directory string / required | Каталог ACME для использования. Это URL-адрес точки входа для доступа к API сервера ACME CA. В целях безопасности значение по умолчанию установлено на тестовый сервер Let’s Encrypt (для протокола ACME v1). Это создаст технически правильные, но недоверенные сертификаты. Для Let’s Encrypt все тестовые конечные точки можно найти здесь: https://letsencrypt.org/docs/staging-environment/. Для Buypass все конечные точки можно найти здесь: https://community.buypass.com/t/63d4ay/buypass-go-ssl-endpoints Для Let’s Encrypt, URL-адрес производственного каталога для ACME v2 — https://acme-v02.api.letsencrypt.org/directory. Для Buypass, URL-адрес производственного каталога для ACME v2 и v1 — https://api.buypass.com/acme/directory. Для ZeroSSL, URL-адрес производственного каталога для ACME v2 — https://acme.zerossl.com/v2/DV90. Для Sectigo, URL-адрес производственного каталога для ACME v2 — https://acme-qa.secure.trust-provider.com/v2/DV. Примечания к этому модулю содержат список служб ACME, с которыми был протестирован этот модуль. |
acme_version integer / required | Версия ACME конечной точки. Должно быть Значение Варианты:
|
agreement string | URI к документу с условиями обслуживания, с которыми вы соглашаетесь при использовании службы ACME v1 на По умолчанию используется последняя версия, полученная с URL-адреса Этот параметр будет использоваться только тогда, когда |
chain_dest aliases: chain path | Если указано, промежуточный сертификат будет записан в этот файл. |
challenge string | Вызов, который будет выполнен. Если установлен в Варианты:
|
csr aliases: src path | Файл, содержащий CSR для нового сертификата. Может быть создан с помощью community.crypto.openssl_csr. CSR может содержать несколько дополнительных имен субъекта, но каждое из них приведет к отдельному вызову, который должен быть выполнен для подписания CSR. Примечание. Закрытый ключ, используемый для создания CSR, не должен быть ключом учетной записи. С точки зрения безопасности это плохая идея, и центр сертификации не должен принимать CSR. В этом случае сервер ACME должен вернуть ошибку. Должен быть указан ровно один из |
csr_content string added in community.crypto 1.2.0 | Содержимое CSR для нового сертификата. Может быть создан с помощью community.crypto.openssl_csr_pipe. CSR может содержать несколько дополнительных имен субъектов (Subject Alternate Names), но каждое из них приведет к отдельному вызову, который должен быть выполнен для подписания CSR. Примечание: закрытый ключ, используемый для создания CSR, не должен быть ключом учетной записи. С точки зрения безопасности это плохая идея, и центр сертификации не должен принимать CSR. В этом случае сервер ACME должен возвращать ошибку. Должен быть указан ровно один из |
data dictionary | Данные для проверки текущих вызовов. Это должно быть указано только для второго запуска модуля. Значение, которое должно использоваться здесь, будет предоставлено предыдущим использованием этого модуля. См. примеры для получения более подробной информации. Обратите внимание, что для ACME v2 будет использоваться только запись Примечание: опция |
deactivate_authzs boolean | Деактивировать объекты аутентификации (authz) после выдачи сертификата или в случае неудачи при выдаче сертификата. Объекты аутентификации привязаны к ключу учетной записи и остаются действительными в течение определенного периода времени, и могут использоваться для выдачи сертификатов без необходимости повторной аутентификации домена. Это может быть проблемой безопасности. Варианты:
|
dest aliases: cert path | Файл назначения для сертификата. Обязательно, если |
force boolean | Принудительно выполняет проверку и валидацию, даже если существующий сертификат все еще действителен более чем на Это особенно полезно при наличии обновленного CSR, например, с дополнительными доменами, для которых желателен новый сертификат. Варианты:
|
fullchain_dest aliases: fullchain path | Файл назначения для полной цепочки (то есть сертификат, за которым следует цепочка промежуточных сертификатов). Обязательно, если |
include_renewal_cert_id string added in community.crypto 2.20.0 | Определяет, следует ли запрашивать продление существующего сертификата в соответствии с черновиком ACME ARI 3. Это используется только тогда, когда сертификат, указанный в
В целом, вы должны использовать Серверы ACME могут отказаться создавать новые заказы с Варианты:
|
modify_account boolean | Логическое значение, указывающее, должен ли модуль создавать учетную запись, если это необходимо, и обновлять ее контактные данные. Установите в Если установлено в Варианты:
|
remaining_days integer | Количество дней, которые должны остаться до истечения срока действия сертификата. Если Чтобы убедиться, что сертификат продлевается в любом случае, вы можете использовать параметр Значение по умолчанию: |
request_timeout integer added in community.crypto 2.3.0 | Время, в течение которого Ansible должен ожидать ответа от API ACME. Это время ожидания применяется ко всем запросам HTTP(S) (HEAD, GET, POST). Значение по умолчанию: |
retrieve_all_alternates boolean | При установке в Варианты:
|
select_chain list / elements=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 могут требовать, чтобы это значение было истинным. Этот параметр будет использоваться только тогда, когда Варианты:
|
validate_certs boolean | Проверять ли вызовы в каталог ACME сертификаты TLS. Предупреждение: Следует только устанавливать в Варианты:
|
Атрибуты
Атрибут | Поддержка | Описание |
|---|---|---|
action_group | Группы действий: community.crypto.acme, acme | Используйте |
check_mode | Поддержка: полная | Может работать в режиме |
diff_mode | Поддержка: отсутствует | Будет возвращать подробную информацию о том, что изменилось (или, возможно, должно измениться в |
safe_file_operations | Поддержка: полная | Использует строгие функции работы с файлами Ansible для обеспечения правильных разрешений и предотвращения повреждения данных. |
Примечания
Примечание
- Должен быть указан хотя бы один из
destиfullchain_dest. - Этот модуль включает в себя базовые функции управления учетными записями. Если вам нужен больший контроль над вашей учетной записью ACME, используйте модуль community.crypto.acme_account и отключите управление учетными записями для этого модуля, используя опцию
modify_account. - Этот модуль назывался
letsencryptдо Ansible 2.6. Использование не изменилось. - Хотя значения по умолчанию выбраны таким образом, что модуль может использоваться с центром сертификации Let’s Encrypt, модуль в принципе может использоваться с любым центром сертификации, предоставляющим конечную точку ACME, например, Buypass Go SSL.
- На данный момент модули ACME были протестированы разработчиками только на Let’s Encrypt (staging и production), Buypass (staging и production), ZeroSSL (production) и Pebble testing server. Мы получили отзывы сообщества о том, что они также работают с Sectigo ACME Service for InCommon. Если у вас возникнут проблемы с другим сервером ACME, пожалуйста, создайте обращение, чтобы помочь нам в его поддержке. Отзывы о работоспособности с незамеченным сервером ACME также приветствуются.
- Если доступна достаточно новая версия библиотеки
cryptography(см. раздел «Требования» для получения подробной информации), она будет использоваться вместо двоичного файлаopenssl. Это можно явно отключить или включить с помощью опцииselect_crypto_backend. Обратите внимание, что использование двоичного файлаopensslбудет медленнее и менее безопасно, поскольку содержимое закрытого ключа всегда должно храниться на диске (см.account_key_content).
См. также
См. также
- Документация Let’s Encrypt
-
Документация для центра сертификации Let’s Encrypt. Предоставляет полезную информацию, например, об ограничениях скорости.
- Buypass Go SSL
-
Документация для центра сертификации Buypass. Предоставляет полезную информацию, например, об ограничениях скорости.
- Automatic Certificate Management Environment (ACME)
-
Спецификация протокола ACME (RFC 8555).
- ACME TLS ALPN Challenge Extension
-
Спецификация вызова
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
-
Позволяет найти корневой сертификат для возвращенного fullchain.
- 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
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
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
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 }}"
### 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
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 }}"
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
acme_version: 2
# 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.
when: sample_com_challenge is changed
Возвращаемые значения
Общие возвращаемые значения документированы здесь, следующие поля уникальны для этого модуля:
Ключ | Описание |
|---|---|
account_uri string | URI учетной записи ACME. Возвращено: изменено |
all_chains list / elements=dictionary | Когда См. раздел 7.4.2 RFC8555 для получения подробной информации. Возвращено: когда сертификат был получен и |
|
cert string |
Сам лиственный сертификат в формате PEM. Возвращено: всегда |
|
chain string |
Цепочка сертификатов, за исключением корневого, как объединенные сертификаты PEM. Возвращено: всегда |
|
full_chain string |
Цепочка сертификатов, за исключением корневого, но включая лиственный сертификат, как объединенные сертификаты PEM. Возвращено: всегда |
authorizations dictionary | Данные авторизации ACME. Сопоставляет идентификатор с объектами авторизации ACME. См. https://tools.ietf.org/html/rfc8555#section-7.1.4. Возвращено: изменено Пример: |
cert_days integer | Количество дней, в течение которых сертификат остается действительным. Возвращено: успех |
challenge_data dictionary | Данные вызова на идентификатор / тип вызова. Начиная с Ansible 2.8.5, возвращаются только те вызовы, которые еще не действительны. Возвращено: изменено |
|
identifier dictionary |
Для каждого идентификатора предоставляет словарь типов вызовов, сопоставляемых с данными вызова. Ключи в этом словаре являются идентификаторами. Обратите внимание, что ключи не являются допустимыми идентификаторами Jinja2. Возвращено: изменено |
|
challenge-type dictionary |
Данные для каждого типа вызова. Ключи в этом словаре являются типами вызовов. Обратите внимание, что ключи не являются допустимыми идентификаторами Jinja2. Возвращено: изменено |
|
record string |
Полное имя записи DNS для вызова. Возвращено: изменено и вызов Пример: |
|
resource string |
Ресурс вызова, который должен быть создан для проверки. Возвращено: изменено Пример: |
|
resource_original string |
Исходный ресурс вызова, включая идентификатор типа для вызовов Возвращено: изменено и Пример: |
|
resource_value string |
Значение, которое должен производить ресурс для проверки. Для вызовов Для вызовов Возвращено: изменено Пример: |
challenge_data_dns dictionary | Список значений TXT для каждой записи DNS, если вызов Начиная с Ansible 2.8.5, возвращаются только те вызовы, которые еще не действительны. Возвращено: изменено |
finalization_uri string | URI завершения ACME. Возвращено: изменено |
order_uri string | URI заказа ACME. Возвращено: changed |
Ссылки на коллекцию
© 2012–2018 Michael DeHaan
© 2018–2024 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/latest/collections/community/crypto/acme_certificate_module.html