Spec-Zone.ru › Ansible 2.11

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

Документация для 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

Spec-Zone.ru

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