Spec-Zone.ru › Ansible 2.10

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
целое число
    Варианты:
  • 1
  • 2
Версия 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
строка
    Варианты:
  • http-01 ←
  • dns-01
  • tls-alpn-01
Выполняемый вызов.
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
строка
    Выбоы:
  • first
  • last
  • all ←
Определяет, какие сертификаты в цепочке будут проверены.
all проверяет все сертификаты в цепочке (исключая лист, который идентичен во всех цепочках).
first проверяет только первый сертификат в цепочке, т.е. тот, который подписал лист.
last проверяет только последний сертификат в цепочке, т.е. тот, который дальше всего от листа. Его издатель — корневой сертификат этой цепочки.
select_crypto_backend
строка
    Выбоы:
  • auto ←
  • cryptography
  • openssl
Определяет, какой криптографический бэкенд использовать.
По умолчанию выбирается auto, который пытается использовать cryptography, если он доступен, и переходит к openssl.
Если установлено значение openssl, будет пытаться использовать двоичный файл openssl.
Если установлено значение cryptography, будет пытаться использовать библиотеку cryptography.
terms_agreed
логическое
    Выбоы:
  • no ←
  • yes
Логическое значение, указывающее, согласны ли вы с условиями предоставления услуги.
Серверы ACME могут потребовать, чтобы это значение было true.
Этот параметр будет использован только в том случае, если acme_version не равно 1.
validate_certs
логическое
    Выбоы:
  • no
  • yes ←
Указывает, будут ли проверяться сертификаты 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API