community.crypto.acme_certificate – Создавать сертификаты SSL/TLS с протоколом ACME
Примечание
Этот плагин является частью коллекции community.crypto (версия 1.4.0).
Для установки используйте: ansible-galaxy collection install community.crypto.
Для использования в плейбуке укажите: community.crypto.acme_certificate.
Обзор
- Создавать и обновлять сертификаты SSL/TLS с помощью CA, поддерживающего протокол 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.
Требования
Ниже приведены требования, необходимые на хосте, на котором выполняется этот модуль.
- python >= 2.6
- либо openssl, либо cryptography >= 1.5
Параметры
| Параметр | Варианты/Значения по умолчанию | Комментарии | |
|---|---|---|---|
| account_email строка | Электронный адрес, связанный с этим аккаунтом. Он будет использоваться для предупреждений о истечении срока действия сертификата. Обратите внимание, что когда modify_account не установлено в no, и вы также использовали модуль community.crypto.acme_account для указания более одного контакта для своего аккаунта, этот модуль обновит ваш аккаунт и ограничит его (максимум одним) электронным адресом контакта, указанным здесь. | ||
| account_key_content строка | Содержание ключа аккаунта ACME RSA или эллиптической кривой. Взаимоисключающее с account_key_src.Требуется, если account_key_src не используется.*Предупреждение:* содержимое будет записано во временный файл, который будет удален Ansible по завершении модуля. Поскольку это важный закрытый ключ — он может быть использован для изменения ключа аккаунта или для отзыва ваших сертификатов без знания их закрытых ключей —, это может быть неприемлемо. В случае использования cryptography, содержимое не записывается во временный файл. В процессе перемещения модуля с его аргументом на узел, где он выполняется, всё ещё может произойти запись на диск Ansible. | ||
| account_key_src путь | Путь к файлу, содержащему ключ аккаунта ACME RSA или эллиптической кривой. Закрытые ключи можно создать с помощью модуля community.crypto.openssl_privatekey. Если необходимые библиотеки (pyOpenSSL или cryptography) недоступны, ключи также можно создать непосредственно с помощью openssl командной строки: ключи RSA можно создать с помощью openssl genrsa .... Ключи эллиптической кривой можно создать с помощью openssl ecparam -genkey .... Также можно использовать любой другой инструмент, создающий закрытые ключи в формате PEM.Взаимоисключающее с account_key_content.Требуется, если account_key_content не используется.псевдонимы: account_key | ||
| account_uri строка | Если указано, предполагается, что URI аккаунта имеет указанное значение. Если ключ аккаунта не соответствует этому аккаунту или аккаунт с этим URI не существует, модуль завершается ошибкой. | ||
| acme_directory строка | Используемый каталог ACME. Это URL-адрес точки входа для доступа к API сервера CA. Для безопасности значение по умолчанию установлено на тестовый сервер Let's Encrypt (для протокола ACME v1). Это создаст технически корректные, но недоверенные сертификаты. Значение по умолчанию — https://acme-staging.api.letsencrypt.org/directory. Обратите внимание, что в версии community.crypto 2.0.0 этот параметр *будет обязательным* и более не будет иметь значения по умолчанию. Для 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 v1 — https://acme-v01.api.letsencrypt.org/directory, и URL каталога производства для ACME v2 — https://acme-v02.api.letsencrypt.org/directory. Для Buypass URL каталога производства для ACME v2 и v1 — https://api.buypass.com/acme/directory. *Предупреждение:* На данный момент модуль тестировался только с Let's Encrypt (тестовый и рабочий), Buypass (тестовый и рабочий) и тестовым сервером Pebble. | ||
| acme_version целое число |
| Версия ACME конечной точки. Должно быть 1 для классических конечных точек Let's Encrypt и Buypass ACME, или 2 для стандартизированных конечных точек ACME v2. Значение по умолчанию — 1. Обратите внимание, что в версии community.crypto 2.0.0 этот параметр *будет обязательным* и более не будет иметь значения по умолчанию. Также обратите внимание, что поддержка ACME v1 будет в конечном итоге прекращена. | |
| agreement строка | URI документа с условиями использования при использовании службы ACME v1 на acme_directory.По умолчанию — последняя собранная из acme_directory URL.Этот параметр будет использоваться только тогда, когда acme_version равно 1. | ||
| chain_dest путь | Если указано, промежуточный сертификат будет записан в этот файл. псевдонимы: chain | ||
| challenge строка |
| Выполняемый вызов. | |
| csr путь | Файл, содержащий CSR для нового сертификата. Можно создать с помощью openssl req ....CSR может содержать несколько альтернативных имен субъекта, но каждый из них приведет к отдельному вызову, который необходимо выполнить для подписания CSR.
Примечание: закрытый ключ, используемый для создания CSR, не должен быть ключом аккаунта. Это плохая практика с точки зрения безопасности, и CA не должна принимать CSR. Сервер ACME должен вернуть ошибку в этом случае. Необходимо указать *либо* csr, *либо* csr_content. псевдонимы: src | ||
| csr_content строка добавлено в версии 1.2.0 community.crypto | Содержание CSR для нового сертификата. Можно создать с помощью openssl req ....CSR может содержать несколько альтернативных имен субъекта, но каждый из них приведет к отдельному вызову, который необходимо выполнить для подписания CSR.
Примечание: закрытый ключ, используемый для создания CSR, не должен быть ключом аккаунта. Это плохая практика с точки зрения безопасности, и CA не должна принимать CSR. Сервер ACME должен вернуть ошибку в этом случае. Необходимо указать *либо* csr, *либо* csr_content. | ||
| data словарь | Данные для проверки текущих вызовов. Этот параметр должен быть указан только для повторного запуска модуля. Значение, которое необходимо использовать здесь, будет предоставлено предыдущим использованием этого модуля. Дополнительные сведения см. в примерах. Обратите внимание, что для ACME v2 будет использоваться только запись order_uri в data. Для ACME v1 data должен быть непустым, чтобы указать, что активна вторая фаза; все необходимые данные будут взяты из CSR.
Примечание: параметр data помечался как no_log до Ansible 2.5. Начиная с Ansible 2.6, он больше не помечен таким образом, поскольку это приводит к появлению неиспользуемых сообщений об ошибках, и data не содержит никакой информации, которая может быть использована без доступа к ключу учетной записи или которая не является общедоступной. | ||
| deactivate_authzs булево |
| Деактивировать объекты аутентификации (authz) после выдачи сертификата или при неудачной выдаче сертификата. Объекты аутентификации привязаны к ключу аккаунта и остаются действительными в течение определенного времени и могут использоваться для выдачи сертификатов без повторной аутентификации домена. Это может быть проблемой безопасности. | |
| dest путь | Целевой файл для сертификата. Требуется, если fullchain_dest не указан.псевдонимы: cert | ||
| force булево |
| Вынуждает выполнение вызова и валидации, даже если существующий сертификат остается действительным более чем на remaining_days дней.Это особенно полезно при обновлении CSR, например, с добавлением дополнительных доменов, для которых требуется новый сертификат. | |
| fullchain_dest путь | Целевой файл для полной цепочки (т.е. сертификата, за которым следуют промежуточные сертификаты). Требуется, если dest не указан.псевдонимы: fullchain | ||
| modify_account булево |
| Булево значение, указывающее, должен ли модуль создать аккаунт при необходимости и обновить его контактные данные. Установите в no, если вы хотите использовать модуль community.crypto.acme_account для управления вашим аккаунтом вместо этого и избежать случайного создания нового аккаунта с использованием старого ключа, если вы изменили ключ аккаунта с помощью модуля community.crypto.acme_account.Если установлено в no, terms_agreed и account_email игнорируются. | |
| remaining_days целое число | По умолчанию: 10 | Количество дней, оставшихся до истечения срока действия сертификата. Если cert_days < remaining_days, сертификат будет продлен. Если сертификат не продлен, значения модуля не будут включать challenge_data.Чтобы гарантировать продление сертификата в любом случае, можно использовать параметр force. | |
| retrieve_all_alternates булево |
| Если установлено в yes, будет извлечена вся цепочка альтернативных сертификатов, предлагаемая CA ACME. Они не будут записаны на диск, а будут возвращены вместе с основной цепочкой как all_chains. Подробности см. в документации для значения возврата all_chains. | |
| select_chain list / elements=dictionary added in 1.0.0 of community.crypto | Позволяет указать критерии, по которым можно выбрать (альтернативную) цепочку доверия. Список критериев будет обрабатываться по одному, пока не будет найдена цепочка, соответствующая критерию. Если такая цепочка будет найдена, модуль будет использовать её вместо стандартной цепочки. Если критерий соответствует нескольким цепочкам, будет возвращена первая соответствующая. Порядок определяется порядком заголовков Link, возвращенных сервером ACME, и может быть не детерминированным.Каждый критерий может состоять из нескольких различных условий, таких как issuer и subject. Для того, чтобы критерий соответствовал цепочке, все условия должны относиться к одному и тому же сертификату в цепочке. Этот параметр может использоваться только с бэкэндом cryptography. | ||
| authority_key_identifier string | Проверяет расширение AuthorityKeyIdentifier. Это идентификатор, основанный на закрытом ключе издателя промежуточного сертификата. Идентификатор должен иметь вид C4:A7:B1:A4:7B:2C:71:FA:DB:E1:4B:90:75:FF:C4:15:60:85:89:10. | ||
| issuer dictionary | Позволяет указать части издателя сертификата в цепочке, которые должны быть выбраны. Если issuer пусто, любой сертификат будет соответствовать. Пример значения: {"commonName": "My Preferred CA Root"}. | ||
| subject dictionary | Позволяет указать части субъекта сертификата в цепочке, которые должны быть выбраны. Если subject пусто, любой сертификат будет соответствовать. Пример значения: {"CN": "My Preferred CA Intermediate"}. | ||
| subject_key_identifier string | Проверяет расширение SubjectKeyIdentifier. Это идентификатор, основанный на закрытом ключе промежуточного сертификата. Идентификатор должен иметь вид A8:4A:6A:63:04:7D:DD:BA:E6:D1:39:B7:A6:45:65:EF:F3:A8:EC:A1. | ||
| test_certificates string |
| Определяет, какие сертификаты в цепочке будут проверены.
all проверяет все сертификаты в цепочке (исключая лист, который идентичен во всех цепочках).
first проверяет только первый сертификат в цепочке, т. е. тот, который подписал лист.
last проверяет только последний сертификат в цепочке, т. е. тот, который наиболее удалён от листа. Его издатель — корневой сертификат этой цепочки. | |
| select_crypto_backend string |
| Определяет, какой криптографический бэкэнд использовать. По умолчанию выбран auto, который пытается использовать cryptography, если доступен, и возвращается к openssl. Если установлено значение openssl, будет пытаться использовать двоичный файл openssl. Если установлено значение cryptography, будет пытаться использовать библиотеку cryptography. | |
| terms_agreed boolean |
| Булево значение, указывающее, согласны ли вы с условиями использования. Серверы ACME могут потребовать, чтобы это значение было истинным. Этот параметр будет использован только если acme_version не равно 1. | |
| validate_certs boolean |
| Определяет, будут ли проверяться сертификаты TLS при обращениях к каталогу ACME. *Предупреждение:* Должно быть установлено только в значение no для целей тестирования, например, при тестировании на локальном сервере Pebble. | |
Примечания
Примечание
- Должен быть указан хотя бы один из параметров
destиfullchain_dest. - Этот модуль включает в себя базовые функции управления учетной записью. Если вы хотите иметь больший контроль над вашей учетной записью ACME, используйте модуль community.crypto.acme_account и отключите управление учетной записью для этого модуля, используя параметр
modify_account. - Этот модуль назывался
letsencryptдо Ansible 2.6. Использование не изменилось. - Если доступна достаточно новая версия библиотеки
cryptography(см. Требования для подробностей), она будет использоваться вместо двоичного файлаopenssl. Это можно явно отключить или включить параметромselect_crypto_backend. Обратите внимание, что использование двоичного файлаopensslбудет медленнее и менее безопасным, поскольку содержимое закрытого ключа всегда должно храниться на диске (см.account_key_content). - Хотя значения по умолчанию выбраны таким образом, чтобы модуль можно было использовать с CA Let’s Encrypt, в принципе, модуль может использоваться с любым CA, предоставляющим конечную точку ACME, например, Buypass Go SSL.
См. также
См. также
- Документация Let’s Encrypt
-
Документация для Certification Authority Let’s Encrypt. Предоставляет полезную информацию, например, о ограничениях по скорости.
- Buypass Go SSL
-
Документация для Certification Authority 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_csr
-
Может быть использован для создания запроса на подписание сертификата (CSR).
- community.crypto.certificate_complete_chain
-
Позволяет найти корневой сертификат для возвращенной полной цепочки.
- community.crypto.acme_certificate_revoke
-
Позволяет аннулировать сертификаты.
- community.crypto.acme_account
-
Позволяет создавать, изменять или удалять учетную запись ACME.
- community.crypto.acme_inspect
-
Позволяет отлаживать проблемы.
Примеры
### 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('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:
#
# - 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:
#
# - 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:
#
# - community.aws.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 and 'sample.com' in sample_com_challenge.challenge_data
#
# Alternative way:
#
# - community.aws.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 }}"
# 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 строка | изменённое | URI учётной записи ACME. | |
| all_chains список / элементы=словарь | при получении сертификата и retrieve_all_alternates установлено в yes
| Если retrieve_all_alternates установлено в yes, модуль запросит у сервера ACME альтернативные цепочки. Это возвращаемое значение будет содержать список всех возвращённых цепочек, первой записью в котором будет основная цепочка, возвращённая сервером.См. раздел 7.4.2 RFC8555 для получения подробной информации. | |
| cert строка | всегда | Сам лист-сертификат в формате PEM. | |
| chain строка | всегда | Цепочка сертификатов, исключая корневой, как конкатенированные сертификаты PEM. | |
| full_chain строка | всегда | Цепочка сертификатов, исключая корневой, но включая лист-сертификат, как конкатенированные сертификаты PEM. | |
| authorizations словарь | изменённое | Данные авторизации ACME. Сопоставляет идентификатор с объектами авторизации ACME. См. https://tools.ietf.org/html/rfc8555#section-7.1.4. Пример: {"example.com":{...}} | |
| cert_days целое число | успех | Количество дней, в течение которых сертификат остаётся действительным. | |
| challenge_data список / элементы=словарь | изменённое | Данные проверки по идентификатору/типу проверки. С Ansible 2.8.5 возвращаются только проверки, которые ещё не действительны. | |
| record строка | изменённое и проверка является dns-01
| Полное имя записи DNS для проверки. Пример: _acme-challenge.example.com | |
| resource строка | изменённое | Ресурс проверки, который должен быть создан для валидации. Пример: .well-known/acme-challenge/evaGxfADs6pSRb2LAv9IZf17Dt3juxGJ-PCt92wr-oA | |
| resource_original строка | изменённое и проверка является tls-alpn-01
| Оригинальный ресурс проверки, включая идентификатор типа для tls-alpn-01 проверок.Пример: DNS:example.com | |
| resource_value строка | изменённое | Значение, которое ресурс должен вывести для валидации. Для http-01 и dns-01 проверок значение может быть использовано как есть.Для tls-alpn-01 проверок обратите внимание, что это возвращаемое значение содержит Base64-кодированную версию правильного бинарного блока, который должен быть помещён в расширение acmeValidation x509; см. https://www.rfc-editor.org/rfc/rfc8737.html#section-3 для получения подробной информации. Для этого вам может потребоваться фильтр Jinja b64decode, чтобы извлечь бинарный блок из этого возвращаемого значения.Пример: IlirfxKKXA...17Dt3juxGJ-PCt92wr-oA | |
| challenge_data_dns словарь | изменённое | Список TXT-значений по записи DNS, если проверка является dns-01.С Ansible 2.8.5 возвращаются только проверки, которые ещё не действительны. | |
| finalization_uri строка | изменённое | URI завершения ACME. | |
| order_uri строка | изменённое | URI заказа ACME. | |
Авторы
- Michael Gruener (@mgruener)
© 2012–2018 Michael DeHaan
© 2018–2021 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.11/collections/community/crypto/acme_certificate_module.html