acme_certificate – Создание сертификатов SSL/TLS с протоколом ACME
Новая в версии 2.2.
Обзор
- Создайте и обновите сертификаты SSL/TLS с центром сертификации, поддерживающим протокол ACME, например, Let’s Encrypt или Buypass. Текущая реализация поддерживает
http-01,dns-01иtls-alpn-01вызовы. - Для использования данного модуля необходимо выполнить его дважды. Либо как две отдельные задачи в одном запуске, либо в двух отдельных запусках. Обратите внимание, что вывод первого запуска необходимо сохранить и передать во второй запуск в качестве аргумента модуля
data. - Между этими двумя задачами необходимо выполнить необходимые шаги для выбранного вызова любым необходимым способом. Для
http-01это означает создание необходимого файла вызова на целевом веб-сервере. Дляdns-01необходимо создать необходимый DNS-запись. Дляtls-alpn-01необходимо создать и предоставить необходимый сертификат. Данный модуль не несет ответственности за выполнение этих шагов. - Для получения подробной информации о выполнении этих вызовов, возможно, потребуется ознакомиться со основной спецификацией ACME и спецификацией TLS-ALPN-01. Также обратите внимание на примеры, предоставленные для данного модуля.
- Модуль включает экспериментальную поддержку идентификаторов IP-адресов в соответствии с текущим черновиком ACME IP.
Псевдонимы: letsencrypt
Требования
Ниже перечислены требования, необходимые на хосте, на котором выполняется этот модуль.
- python >= 2.6
- либо openssl, либо cryptography >= 1.5
Параметры
| Параметр | Варианты/Значения по умолчанию | Комментарии |
|---|---|---|
| account_email строка | Адрес электронной почты, связанный с этим аккаунтом. Будет использоваться для предупреждений о истечении срока действия сертификата. Обратите внимание, что когда modify_account не установлено в значение no, и вы использовали модуль acme_account для указания более одного контакта для вашего аккаунта, этот модуль обновит ваш аккаунт и ограничит его (максимум одним) адресом электронной почты контакта, указанным здесь. | |
| account_key_content строка добавлено в 2.5 | Содержание ключа RSA или ключа кривой эллиптических кривых аккаунта ACME. Взаимоисключающее с account_key_src. Требуется, если не используется account_key_src.
Предупреждение: содержание будет записано во временный файл, который будет удалён Ansible по завершении модуля. Поскольку это важный закрытый ключ — он может быть использован для изменения ключа аккаунта или для аннулирования ваших сертификатов, не зная их закрытых ключей —, это может быть неприемлемо. В случае использования cryptography, содержимое не записывается во временный файл. Тем не менее, возможно, что он будет записан на диск Ansible в процессе перемещения модуля с его аргументами на узел, где он выполняется. | |
| account_key_src путь | Путь к файлу, содержащему ключ RSA или ключ кривой эллиптических кривых аккаунта ACME. Ключи RSA можно создать с помощью openssl genrsa .... Ключи кривых эллиптических кривых можно создать с помощью openssl ecparam -genkey .... Также можно использовать любой другой инструмент, создающий закрытые ключи в формате PEM.Взаимоисключающее с account_key_content. Требуется, если не используется account_key_content. псевдонимы: account_key | |
| account_uri строка добавлено в 2.7 | Если указано, предполагается, что URI аккаунта задан как указано. Если ключ аккаунта не совпадает с этим аккаунтом, или аккаунт с этим URI не существует, модуль завершается с ошибкой. | |
| acme_directory строка | По умолчанию: "https://acme-staging.api.letsencrypt.org/directory" | Используемый каталог ACME. Это URL-адрес точки входа для доступа к API сервера CA. Из соображений безопасности по умолчанию установлен сервер Let's Encrypt staging (для протокола ACME v1). Это создаст технически корректные, но недоверенные сертификаты. Для Let's Encrypt все адреса staging можно найти здесь: https://letsencrypt.org/docs/staging-environment/. Для Buypass все адреса можно найти здесь: https://community.buypass.com/t/63d4ay/buypass-go-ssl-endpoints
Для Let's Encrypt URL каталога production для ACME v1 — https://acme-v01.api.letsencrypt.org/directory, а для ACME v2 — https://acme-v02.api.letsencrypt.org/directory. Для Buypass URL каталога production для ACME v2 и v1 — https://api.buypass.com/acme/directory.
Предупреждение: До сих пор модуль тестировался только с Let's Encrypt (staging и production), Buypass (staging и production) и Pebble testing server. |
| acme_version целое число добавлено в 2.5 |
| Версия ACME конечной точки. Должно быть 1 для классических Let's Encrypt и Buypass ACME конечных точек или 2 для стандартизированных конечных точек ACME v2. |
| agreement строка | URI документа условий обслуживания, с которыми вы соглашаетесь при использовании сервиса ACME v1 в acme_directory. Значение по умолчанию — последнее значение, полученное из URL acme_directory. Этот параметр будет использоваться только при значении acme_version равном 1. | |
| chain_dest путь добавлено в 2.5 | Если указано, промежуточный сертификат будет записан в этот файл. псевдонимы: chain | |
| challenge строка |
| Выполняемый вызов. |
| csr путь / обязательно | Файл, содержащий CSR для нового сертификата. Можно создать с помощью openssl req .... CSR может содержать несколько альтернативных имен субъекта, но каждое из них приведёт к отдельному вызову, который должен быть выполнен для подписи CSR.
Примечание: закрытый ключ, используемый для создания CSR, не должен быть ключом аккаунта. Это плохая идея с точки зрения безопасности, и CA не должна принимать CSR. Сервер ACME должен вернуть ошибку в этом случае. псевдонимы: src | |
| data словарь | Данные для проверки текущих вызовов. Это должно быть указано только для второго запуска модуля. Значение, которое должно быть использовано здесь, будет предоставлено предыдущим использованием этого модуля. Более подробную информацию см. в примерах. Обратите внимание, что для ACME v2 будет использоваться только запись order_uri в data. Для ACME v1 data должно быть непустым, чтобы указать активность второго этапа; все необходимые данные будут взяты из CSR.
Примечание: параметр data был помечен как no_log до Ansible 2.5. Начиная с Ansible 2.6, он больше не помечен так, поскольку это приводит к появлению нечитаемых сообщений об ошибках, и data не содержит никакой информации, которая может быть использована без доступа к ключу аккаунта или которая не является общедоступной. | |
| deactivate_authzs булево добавлено в 2.6 |
| Деактивировать объекты аутентификации (authz) после выпуска сертификата или при неудачном выпуске сертификата. Объекты аутентификации привязаны к ключу аккаунта и остаются действительными в течение определенного периода времени и могут быть использованы для выдачи сертификатов без необходимости повторной аутентификации домена. Это может представлять угрозу безопасности. |
| dest путь | Файл назначения для сертификата. Обязательно, если fullchain_dest не указан.псевдонимы: cert | |
| force булево добавлено в 2.6 |
| Вынуждает выполнение вызова и проверки, даже если существующий сертификат по-прежнему действителен более чем на remaining_days.Это особенно полезно при наличии обновлённого CSR, например, с дополнительными доменами, для которых требуется новый сертификат. |
| fullchain_dest путь добавлено в 2.5 | Файл назначения для полного цепочки сертификатов (т.е. сертификат, за которым следует цепочка промежуточных сертификатов). Обязательно, если dest не указан.псевдонимы: fullchain | |
| modify_account булево добавлено в 2.6 |
| Булево значение, указывающее, должен ли модуль создавать аккаунт при необходимости и обновлять его контактные данные. Установите в no, если вы хотите использовать модуль acme_account для управления вашим аккаунтом вместо этого и избежать случайного создания нового аккаунта с использованием старого ключа, если вы изменили ключ аккаунта с помощью acme_account.Если установлено значение no, terms_agreed и account_email игнорируются. |
| remaining_days целое число | По умолчанию: 10 | Количество оставшихся дней, в течение которых сертификат должен оставаться действительным. Если cert_days < remaining_days, то он будет продлён. Если сертификат не продлён, значения модуля не будут включать challenge_data. Чтобы убедиться, что сертификат будет продлён в любом случае, вы можете использовать параметр force. |
| select_crypto_backend строка добавлен в 2.7 |
| Определяет, какой криптографический бэкенд использовать. По умолчанию используется auto, который пытается использовать cryptography если доступен, в противном случае использует openssl. Если установлено значение openssl, будет использована openssl библиотека.Если установлено значение cryptography, будет использована библиотека cryptography. |
| terms_agreed булево добавлен в 2.5 |
| Булевое значение, указывающее, согласны ли вы с условиями обслуживания. Серверы ACME могут потребовать, чтобы это значение было true. Этот параметр будет использоваться только в том случае, если значение acme_version не равно 1. |
| validate_certs булево добавлен в 2.5 |
| Указывает, будут ли проверятся сертификаты TLS при обращении к каталогу ACME.
Предупреждение: Это значение должно устанавливаться только в no для целей тестирования, например, при тестировании с локальным сервером Pebble. |
Примечания
Примечание
- По крайней мере, один из параметров
destиfullchain_destдолжен быть указан. - Этот модуль включает базовые функции управления учетными записями. Если вам нужно больше контроля над вашей учетной записью ACME, используйте модуль 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 Certification Authority. Предоставляет полезную информацию, например, о ограничениях на частоту запросов.
- Buypass Go SSL
- Документация для Buypass Certification Authority. Предоставляет полезную информацию, например, о ограничениях на частоту запросов.
- Automatic Certificate Management Environment (ACME)
- Спецификация протокола ACME (RFC 8555).
- ACME TLS ALPN Challenge Extension
- Текущая черновая спецификация расширения вызова
tls-alpn-01challenge. - acme_challenge_cert_helper — Подготовка сертификатов, необходимых для вызовов ACME, таких как tls-alpn-01
- Помогает подготовить вызовы
tls-alpn-01challenges. - openssl_privatekey — Генерация закрытых ключей OpenSSL
- Может использоваться для создания закрытых ключей (как для сертификатов, так и для учетных записей).
- openssl_csr — Генерация запроса на подпись сертификата (CSR) OpenSSL
- Может использоваться для создания запроса на подпись сертификата (CSR).
- certificate_complete_chain — Полная цепочка сертификатов, заданная набором недоверенных и корневых сертификатов
- Позволяет найти корневой сертификат для возвращаемой полной цепочки.
- acme_certificate_revoke — Отзыв сертификатов с помощью протокола ACME
- Позволяет отозвать сертификаты.
- acme_account — Создание, изменение или удаление учетных записей ACME
- Позволяет создавать, изменять или удалять учетную запись ACME.
- acme_inspect — Отправка прямых запросов на сервер ACME
- Позволяет отлаживать проблемы.
Примеры
### Example with HTTP challenge ###
- name: Create a challenge for sample.com using a account key from a variable.
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.
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.
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
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
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.
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:
#
# - 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:
#
# - 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
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
Возвращаемые значения
Общие возвращаемые значения описаны здесь, следующие являются полями, уникальными для этого модуля:
| Ключ | Возвращено | Описание | |
|---|---|---|---|
| account_uri строка добавлен в 2.5 | изменено | URI учетной записи ACME. | |
| authorizations сложное | изменено | Данные авторизации ACME. | |
| authorization словарь | успешно | Объект авторизации ACME. См. https://tools.ietf.org/html/rfc8555#section-7.1.4
| |
| cert_days целое число | успешно | Количество дней, в течение которых сертификат остается действительным. | |
| challenge_data сложное | изменено | Данные для каждого идентификатора/типа вызова. | |
| record строка добавлен в 2.5 | изменено и вызов dns-01
| Полное имя записи DNS для вызова. Пример: _acme-challenge.example.com | |
| resource строка | изменено | Ресурс вызова, который должен быть создан для проверки. Пример: .well-known/acme-challenge/evaGxfADs6pSRb2LAv9IZf17Dt3juxGJ-PCt92wr-oA | |
| resource_original строка добавлен в 2.8 | изменено и вызов tls-alpn-01
| Исходный ресурс вызова, включая идентификатор типа для tls-alpn-01 вызовов.Пример: DNS:example.com | |
| resource_value строка | изменено | Значение, которое ресурс должен выдать для проверки. Для http-01 и dns-01 вызовов значение может использоваться непосредственно.Для tls-alpn-01 вызовов обратите внимание, что это возвращаемое значение содержит Base64-кодированную версию правильного двоичного объекта, который необходимо поместить в расширение acmeValidation x509. Подробнее см. https://tools.ietf.org/html/draft-ietf-acme-tls-alpn-05#section-3. Для этого вам может потребоваться Jinja-фильтр b64decode, чтобы извлечь двоичный объект из этого возвращаемого значения.Пример: IlirfxKKXA...17Dt3juxGJ-PCt92wr-oA | |
| challenge_data_dns словарь добавлен в 2.5 | изменено | Список значений TXT для каждой записи DNS, если вызов dns-01. | |
| finalization_uri строка добавлен в 2.5 | изменено | URI окончательной обработки ACME. | |
| order_uri строка добавлен в 2.5 | изменено | URI заказа ACME. | |
Состояние
- Этот модуль не гарантирует обратную совместимость интерфейса. [preview]
- Этот модуль поддерживается сообществом Ansible. [community]
Авторы
- 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.8/modules/acme_certificate_module.html