acme_certificate – Создание сертификатов SSL/TLS с помощью протокола ACME
Описание
- Создание и обновление сертификатов 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-адресов в соответствии с RFC 8738.
Псевдонимы: 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. |
| retrieve_all_alternates boolean добавлен в 2.9 |
| Если установлено значение yes, будут извлечены все альтернативные цепочки, предлагаемые центром сертификации ACME. Они не будут записаны на диск, а будут возвращены вместе с основной цепочкой как all_chains. Подробности см. в документации для значения возврата all_chains. |
| select_crypto_backend строка добавлен в 2.7 |
| Определяет, какой криптографический бэкенд использовать. По умолчанию выбран auto, который пытается использовать cryptography, если доступен, и переходит к openssl, если нет.Если установлено значение openssl, будет попытка использовать двоичный файл openssl.Если установлено значение cryptography, будет попытка использовать библиотеку cryptography. |
| terms_agreed boolean добавлен в 2.5 |
| Булево значение, указывающее, согласны ли вы с условиями обслуживания. Серверы ACME могут потребовать, чтобы это значение было истинным. Этот параметр будет использоваться только тогда, когда acme_version не равно 1. |
| validate_certs boolean добавлен в 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). - Хотя значения по умолчанию выбраны таким образом, чтобы модуль можно было использовать с центром сертификации Let’s Encrypt, в принципе, модуль можно использовать с любым центром сертификации, предоставляющим конечную точку 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). - acme_challenge_cert_helper — Подготовка сертификатов, необходимых для вызовов ACME, таких как tls-alpn-01
- Помогает в подготовке вызовов
tls-alpn-01. - 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. | |
| 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 строка добавлено в 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://www.rfc-editor.org/rfc/rfc8737.html#section-3 для подробностей. Для этого вам может понадобиться b64decode фильтр Jinja для извлечения двоичного блока из этого возвращаемого значения.Пример: IlirfxKKXA...17Dt3juxGJ-PCt92wr-oA | |
| challenge_data_dns словарь добавлено в 2.5 | изменено | Список TXT-значений по DNS-записи, если вызов dns-01.Начиная с Ansible 2.8.5, возвращаются только вызовы, которые еще не действительны. | |
| finalization_uri строка добавлено в 2.5 | изменено | URI завершения ACME. | |
| order_uri строка добавлено в 2.5 | изменено | URI заказа ACME. | |
Статус
- Этот модуль не гарантирует обратную совместимость. [превью]
- Этот модуль поддерживается сообществом 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.9/modules/acme_certificate_module.html