community.crypto.acme_certificate – Создание сертификатов SSL/TLS с помощью протокола ACME
Примечание
Этот плагин является частью коллекции community.crypto (версия 1.3.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 строка | Содержимое ключа RSA или эллиптической кривой учётной записи ACME. Взаимоисключающее с account_key_src.Требуется, если account_key_src не используется.*Предупреждение:* содержимое будет записано во временный файл, который будет удалён Ansible по завершении модуля. Поскольку это важный закрытый ключ — он может быть использован для изменения ключа учётной записи или для отзыва ваших сертификатов без знания их закрытых ключей —, это может быть неприемлемо. В случае использования cryptography, содержимое не записывается во временный файл. Всё ещё возможно, что оно запишется на диск Ansible в процессе перемещения модуля с его аргументом на узел, где он выполняется. | ||
| account_key_src путь | Путь к файлу, содержащему ключ RSA или эллиптической кривой учётной записи ACME. Закрытые ключи можно создать с помощью модуля 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, а для 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.Значение по умолчанию — последнее полученное из URL acme_directory.Этот параметр будет использоваться только когда 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 список / элементы=словарь добавлен в 1.0.0 community.crypto | Позволяет указать критерии для выбора (альтернативной) цепочки доверия. Список критериев будет обрабатываться по одному до тех пор, пока не будет найдена цепочка, соответствующая критерию. Если такая цепочка найдена, модуль будет использовать её вместо стандартной цепочки. Если критерий соответствует нескольким цепочкам, будет возвращена первая соответствующая. Порядок определяется порядком заголовков Link, возвращаемых сервером ACME, и может быть не детерминированным.Каждый критерий может состоять из нескольких различных условий, таких как issuer и subject. Для соответствия критерия цепочке все условия должны применяться к одному сертификату в цепочке. Этот параметр может использоваться только с бэкэндом cryptography. | ||
| authority_key_identifier строка | Проверяет наличие расширения AuthorityKeyIdentifier. Это идентификатор, основанный на закрытом ключе издателя промежуточного сертификата. Идентификатор должен иметь вид C4:A7:B1:A4:7B:2C:71:FA:DB:E1:4B:90:75:FF:C4:15:60:85:89:10. | ||
| issuer словарь | Позволяет указать части издателя сертификата в цепочке, которые должны быть выбраны. Если issuer пустой, любой сертификат будет соответствовать. Пример значения {"commonName": "My Preferred CA Root"}. | ||
| subject словарь | Позволяет указать части субъекта сертификата в цепочке, которые должны быть выбраны. Если subject пустой, любой сертификат будет соответствовать. Пример значения {"CN": "My Preferred CA Intermediate"} | ||
| subject_key_identifier строка | Проверяет наличие расширения SubjectKeyIdentifier. Это идентификатор, основанный на закрытом ключе промежуточного сертификата. Идентификатор должен иметь вид A8:4A:6A:63:04:7D:DD:BA:E6:D1:39:B7:A6:45:65:EF:F3:A8:EC:A1. | ||
| test_certificates строка |
| Определяет, какие сертификаты в цепочке будут проверены.
all проверяет все сертификаты в цепочке (исключая лист, который идентичен во всех цепочках).
first проверяет только первый сертификат в цепочке, т.е. тот, который подписал лист.
last проверяет только последний сертификат в цепочке, т.е. тот, который дальше всего от листа. Его издатель — корневой сертификат этой цепочки. | |
| select_crypto_backend строка |
| Определяет, какой криптографический бэкенд использовать. По умолчанию выбирается auto, который пытается использовать cryptography, если он доступен, и переходит к openssl.Если установлено значение openssl, будет пытаться использовать двоичный файл openssl.Если установлено значение cryptography, будет пытаться использовать библиотеку cryptography. | |
| terms_agreed логическое |
| Логическое значение, указывающее, согласны ли вы с условиями предоставления услуги. Серверы ACME могут потребовать, чтобы это значение было true. Этот параметр будет использован только в том случае, если acme_version не равно 1. | |
| validate_certs логическое |
| Указывает, будут ли проверяться сертификаты 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
-
Документация по удостоверяющему центру Let’s Encrypt. Предоставляет полезную информацию, например, о ограничениях на частоту запросов.
- Buypass Go SSL
-
Документация по удостоверяющему центру Buypass. Предоставляет полезную информацию, например, о ограничениях на частоту запросов.
- Система автоматического управления сертификатами (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_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 | dictsort }}"
# 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 | dictsort }}"
# 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–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.10/collections/community/crypto/acme_certificate_module.html