community.crypto.acme_certificate 模块 – 使用 ACME 协议创建 SSL/TLS 证书

注意

此模块是 community.crypto 集合 (版本 2.22.3) 的一部分。

如果您使用的是 ansible 包,则可能已经安装了此集合。它不包含在 ansible-core 中。要检查它是否已安装,请运行 ansible-galaxy collection list

要安装它,请使用:ansible-galaxy collection install community.crypto。您需要其他要求才能使用此模块,有关详细信息,请参阅 要求

要在 playbook 中使用它,请指定:community.crypto.acme_certificate

概要

  • 使用支持 ACME 协议 的 CA(例如 Let’s EncryptBuypass)创建和续订 SSL/TLS 证书。当前实现支持 http-01dns-01tls-alpn-01 挑战。

  • 要使用此模块,必须执行两次。要么在同一运行中作为两个不同的任务,要么在两次运行中。请注意,第一次运行的输出需要被记录下来,并作为模块参数 data 传递给第二次运行。

  • 在这两个任务之间,您必须通过任何必要的方式完成所选挑战的必要步骤。对于 http-01,这意味着在目标 Web 服务器上创建必要的挑战文件。对于 dns-01,必须创建必要的 DNS 记录。对于 tls-alpn-01,必须创建和提供必要的证书。此模块 _不_ 负责执行这些步骤。

  • 有关如何完成这些挑战的详细信息,您可能需要阅读 主要的 ACME 规范TLS-ALPN-01 规范。此外,请考虑为此模块提供的示例。

  • 该模块包含对根据 RFC 8738 的 IP 标识符的实验性支持。

要求

以下要求是在执行此模块的主机上所需的。

参数

参数

注释

account_email

字符串

与该帐户关联的电子邮件地址。

它将用于证书到期警告。

请注意,当 modify_account 未设置为 false 并且您还使用 community.crypto.acme_account 模块为您的帐户指定多个联系人时,此模块将更新您的帐户并将其限制为此处指定的(最多一个)联系人电子邮件地址。

account_key_content

字符串

ACME 帐户 RSA 或椭圆曲线密钥的内容。

account_key_src 互斥。

如果未使用 account_key_src,则需要此参数。

警告:内容将被写入临时文件,该文件将在模块完成时由 Ansible 删除。由于这是一个重要的私钥——它可以用来更改帐户密钥,或者在不知道其私钥的情况下撤销您的证书——这可能不可接受。

如果使用 cryptography,则内容不会写入临时文件。它仍然可能发生 Ansible 在将模块及其参数移动到执行它的节点的过程中将其写入磁盘的情况。

account_key_passphrase

字符串

在 community.crypto 1.6.0 中添加

用于解码帐户密钥的密码。

注意:这不受 openssl 后端支持,仅受 cryptography 后端支持。

account_key_src

别名:account_key

路径

包含 ACME 账户 RSA 或椭圆曲线密钥的文件路径。

可以使用 community.crypto.openssl_privatekeycommunity.crypto.openssl_privatekey_pipe 模块创建私钥。如果所需的 (cryptography) 库不可用,也可以使用 openssl 命令行工具直接创建密钥:可以使用 openssl genrsa ... 创建 RSA 密钥。可以使用 openssl ecparam -genkey ... 创建椭圆曲线密钥。也可以使用任何其他创建 PEM 格式私钥的工具。

account_key_content 互斥。

如果未使用 account_key_content,则此参数为必填。

account_uri

字符串

如果指定,则假定帐户 URI 与所提供的一致。如果帐户密钥与该帐户不匹配,或者不存在具有此 URI 的帐户,则模块将失败。

acme_directory

字符串 / 必填

要使用的 ACME 目录。这是访问 ACME CA 服务器 API 的入口点 URL。

出于安全原因,默认设置为 Let's Encrypt 暂存服务器(适用于 ACME v1 协议)。这将创建技术上正确的证书,但这些证书不受信任。

对于 Let's Encrypt,所有暂存端点都可以在此处找到:https://letsencrypt.openssl.ac.cn/docs/staging-environment/。对于 Buypass,所有端点都可以在此处找到:https://community.buypass.com/t/63d4ay/buypass-go-ssl-endpoints

对于 **Let's Encrypt**,ACME v2 的生产目录 URL 为 https://acme-v02.api.letsencrypt.org/directory

对于 **Buypass**,ACME v2 和 v1 的生产目录 URL 为 https://api.buypass.com/acme/directory

对于 **ZeroSSL**,ACME v2 的生产目录 URL 为 https://acme.zerossl.com/v2/DV90

对于 **Sectigo**,ACME v2 的生产目录 URL 为 https://acme-qa.secure.trust-provider.com/v2/DV

此模块的说明包含已针对其测试过此模块的 ACME 服务列表。

acme_version

整数 / 必填

端点的 ACME 版本。

对于经典的 Let's Encrypt 和 Buypass ACME 端点,必须为 1,对于标准化的 ACME v2 端点,必须为 2

自 community.crypto 2.0.0 版本起,1 值已弃用,并将从 community.crypto 3.0.0 版本中移除。

选项

  • 1

  • 2

agreement

字符串

使用 acme_directory 中的 ACME v1 服务时,您同意的服务条款文档的 URI。

默认为从 acme_directory URL 收集的最新版本。

仅当 acme_version 为 1 时,才会使用此选项。

chain_dest

别名:chain

路径

如果指定,则中间证书将写入此文件。

challenge

字符串

要执行的挑战。

如果设置为 no challenge,则不使用任何挑战。对于某些使用外部帐户绑定和其他验证证书保证方法的私有 CA,这是必需的。例如,帐户可以在一定时间内被允许为 foo.example.com 发行证书,无需任何进一步的验证。

选项

  • "http-01" ← (默认)

  • "dns-01"

  • "tls-alpn-01"

  • "no challenge"

csr

别名:src

路径

包含新证书 CSR 的文件。

可以使用 community.crypto.openssl_csr 创建。

CSR 可以包含多个主题备用名称,但每个名称都会导致必须满足的单独挑战才能签署 CSR。

注意:用于创建 CSR 的私钥 **不能** 是帐户密钥。从安全的角度来看,这是一个坏主意,CA 不应接受 CSR。ACME 服务器在这种情况下应返回错误。

必须精确指定 csrcsr_content 之一。

csr_content

字符串

在 community.crypto 1.2.0 中添加

新证书的 CSR 内容。

可以使用 community.crypto.openssl_csr_pipe 创建。

CSR 可以包含多个主题备用名称,但每个名称都会导致必须满足的单独挑战才能签署 CSR。

注意:用于创建 CSR 的私钥 **不能** 是帐户密钥。从安全的角度来看,这是一个坏主意,CA 不应接受 CSR。ACME 服务器在这种情况下应返回错误。

必须精确指定 csrcsr_content 之一。

data

字典

验证正在进行的挑战的数据。这必须仅在模块的第二次运行中指定。

此处必须使用的值将由模块的先前使用提供。有关更多详细信息,请参见示例。

请注意,对于 ACME v2,仅使用 order_uri 条目 data。对于 ACME v1,data 必须是非空的,以指示第二阶段处于活动状态;所有需要的数据都将从 CSR 中获取。

注意data 选项在 Ansible 2.5 之前被标记为 no_log。从 Ansible 2.6 开始,它不再以这种方式标记,因为它会导致错误消息变得无法使用,并且 data 不包含任何可在没有访问帐户密钥的情况下使用或根本不是公开的信息。

deactivate_authzs

布尔值

在颁发证书后或颁发证书失败时停用身份验证对象 (authz)。

身份验证对象绑定到帐户密钥并在一段时间内保持有效,并且可用于颁发证书,而无需重新验证域。这可能是一个安全隐患。

选项

  • false ← (默认)

  • true

dest

别名:cert

路径

证书的目标文件。

如果未指定 fullchain_dest,则此参数为必填。

force

布尔值

强制执行挑战和验证,即使现有证书仍然有效超过 remaining_days 天。

当更新 CSR 时,这尤其有用,例如,当需要新证书的其他域时。

选项

  • false ← (默认)

  • true

fullchain_dest

别名:fullchain

路径

完整链的目标文件(即,证书后跟中间证书链)。

如果未指定 dest,则此参数为必填。

include_renewal_cert_id

字符串

在 community.crypto 2.20.0 中添加

确定是否根据 ACME ARI 草案 3 请求续订现有证书。

仅当 destfullchain_dest 中指定的证书已存在时才使用。

never 从不发送要续订的证书的证书 ID。 always 将始终发送它。

when_ari_supported 仅在 ACME 目录中找到 ARI 端点时才发送证书 ID。

如果您知道 ACME 服务支持 ARI 扩展的兼容草案(或最终版本,一旦发布),通常应使用 when_ari_supportedalways 永远是不必要的。如果不确定,或者在订单对象中收到关于无效 replaces 值的奇怪错误,请使用 never,这也恰好是默认值。

ACME 服务器可能会拒绝为已经存在订单的证书创建新的订单,其中包含 replaces 参数。如果使用此模块创建订单,然后由于无法设置挑战而导致 playbook/角色失败,则可能会发生这种情况。如果 playbook/角色没有记录订单数据以继续使用现有订单,而是在下次运行时尝试创建一个新的订单,则创建新订单可能会失败。因此,只有在使用此选项的角色/playbook 能够跟踪重启间的订单数据,或者能够停用处理中断的订单时,才应将此选项设置为不同于 never 的值。可以使用 community.crypto.acme_certificate_deactivate_authz 模块停用订单。

选项

  • "never" ← (默认)

  • "when_ari_supported"

  • "always"

modify_account

布尔值

布尔值,指示模块是否需要时创建帐户并更新其联系数据。

如果您想使用 community.crypto.acme_account 模块来管理您的帐户,并避免在您使用 community.crypto.acme_account 更改帐户密钥后意外使用旧密钥创建新帐户,则将其设置为 false

如果设置为 false,则忽略 terms_agreedaccount_email

选项

  • false

  • true ← (默认)

remaining_days

整数

证书必须剩余的有效天数。如果 cert_days < remaining_days,则将对其进行续期。如果证书未续期,模块返回值将不包含 challenge_data

为了确保在任何情况下都续期证书,可以使用 force 选项。

默认值: 10

request_timeout

整数

community.crypto 2.3.0 版本中添加

Ansible 应等待 ACME API 响应的时间。

此超时适用于所有 HTTP(S) 请求 (HEAD、GET、POST)。

默认值: 10

retrieve_all_alternates

布尔值

设置为 true 时,将检索 ACME CA 提供的所有备用信任链。这些不会写入磁盘,但会与主链一起作为 all_chains 返回。有关详细信息,请参阅 all_chains 返回值的文档。

选项

  • false ← (默认)

  • true

select_chain

列表 / 元素=字典

community.crypto 1.0.0 版本中添加

允许指定选择(备用)信任链的标准。

将逐一处理标准列表,直到找到与标准匹配的链。如果找到这样的链,模块将使用它而不是默认链。

如果一个标准匹配多个链,则返回第一个匹配的链。顺序由 ACME 服务器返回的 Link 标头确定,可能不是确定的。

每个标准可以包含多个不同的条件,例如 select_chain[].issuerselect_chain[].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

字典

允许指定链中证书的颁发者必须具有的部分。

如果 select_chain[].issuer 为空,则任何证书都将匹配。

示例值为 {"commonName": "My Preferred CA Root"}

subject

字典

允许指定链中证书的主题必须具有的部分。

如果 select_chain[].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 只测试链中的最后一个证书,即离叶证书最远的证书。其颁发者是此链的根证书。

选项

  • "first"

  • "last"

  • "all" ← (默认)

select_crypto_backend

字符串

确定要使用的加密后端。

默认选择是 auto,如果可用,它会尝试使用 cryptography,否则回退到 openssl

如果设置为 openssl,将尝试使用 openssl 二进制文件。

如果设置为 cryptography,将尝试使用 cryptography 库。

选项

  • "auto" ← (默认)

  • "cryptography"

  • "openssl"

terms_agreed

布尔值

布尔值,指示您是否同意服务条款文档。

ACME 服务器可能要求将其设置为 true。

只有当 acme_version 不是 1 时,才会使用此选项。

选项

  • false ← (默认)

  • true

validate_certs

布尔值

对 ACME 目录的调用是否验证 TLS 证书。

警告: 仅应在测试目的时(例如,针对本地 Pebble 服务器进行测试)将其设置为 false

选项

  • false

  • true ← (默认)

属性

属性

支持

描述

action_group

动作组: community.crypto.acmeacme

module_defaults 中使用 group/acmegroup/community.crypto.acme 为此模块设置默认值。

check_mode

支持:完全支持

可以在 check_mode 模式下运行,并在不修改目标的情况下返回更改状态预测。

diff_mode

支持:不支持

处于 diff 模式时,将返回关于已更改内容(或可能需要在 check_mode 模式下更改的内容)的详细信息。

safe_file_operations

支持:完全支持

使用 Ansible 的严格文件操作函数来确保正确的权限并避免数据损坏。

注释

注意

  • 必须指定至少一个 destfullchain_dest

  • 此模块包含基本帐户管理功能。如果您想更详细地控制您的 ACME 帐户,请使用 community.crypto.acme_account 模块,并使用 modify_account 选项为此模块禁用帐户管理。

  • 在 Ansible 2.6 之前,此模块被称为 letsencrypt。使用方法没有改变。

  • 尽管默认值的选择使得该模块可以与 Let’s Encrypt CA 一起使用,但原则上该模块可以与任何提供 ACME 端点的 CA 一起使用,例如 Buypass Go SSL

  • 到目前为止,ACME 模块仅由开发人员针对 Let’s Encrypt(暂存和生产)、Buypass(暂存和生产)、ZeroSSL(生产)和 Pebble 测试服务器 进行过测试。我们收到了社区的反馈,这些模块也可以与用于 InCommon 的 Sectigo ACME 服务一起使用。如果您在使用其他 ACME 服务器时遇到问题,请 创建一个问题 来帮助我们支持它。我们也欢迎您反馈未提及的 ACME 服务器是否可以正常工作。

  • 如果可以使用足够新版本的 cryptography 库(详情请参阅“需求”),它将代替 openssl 二进制文件使用。这可以通过 select_crypto_backend 选项显式禁用或启用。请注意,使用 openssl 二进制文件将更慢且安全性较低,因为私钥内容始终必须存储在磁盘上(请参阅 account_key_content)。

另请参阅

另请参阅

Let’s Encrypt 文档

Let’s Encrypt 证书颁发机构的文档。例如,提供有关速率限制的有用信息。

Buypass Go SSL

Buypass 证书颁发机构的文档。例如,提供有关速率限制的有用信息。

自动证书管理环境 (ACME)

ACME 协议的规范 (RFC 8555)。

ACME TLS ALPN 挑战扩展

tls-alpn-01 挑战的规范 (RFC 8737)。

community.crypto.acme_challenge_cert_helper

帮助准备 tls-alpn-01 挑战。

community.crypto.openssl_privatekey

可用于创建私钥(证书和帐户)。

community.crypto.openssl_privatekey_pipe

可用于创建私钥而无需将其写入磁盘(证书和帐户)。

community.crypto.openssl_csr

可用于创建证书签名请求 (CSR)。

community.crypto.openssl_csr_pipe

可用于创建证书签名请求 (CSR) 而无需将其写入磁盘。

community.crypto.certificate_complete_chain

允许查找返回的 fullchain 的根证书。

community.crypto.acme_certificate_revoke

允许吊销证书。

community.crypto.acme_account

允许创建、修改或删除 ACME 帐户。

community.crypto.acme_inspect

允许调试问题。

community.crypto.acme_certificate_deactivate_authz

允许停用(使无效)ACME v2 订单。

示例

### 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('community.hashi_vault.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:
#
# - name: Copy http-01 challenge for sample.com
#   ansible.builtin.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:
#
# - name: Copy http-01 challenges
#   ansible.builtin.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: [email protected]
    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:
#
# - name: Create DNS record for sample.com dns-01 challenge
#   community.aws.route53:
#     zone: sample.com
#     record: "{{ sample_com_challenge.challenge_data['sample.com']['dns-01'].record }}"
#     type: TXT
#     ttl: 60
#     state: present
#     wait: true
#     # Note: route53 requires TXT entries to be enclosed in quotes
#     value: "{{ sample_com_challenge.challenge_data['sample.com']['dns-01'].resource_value | community.dns.quote_txt(always_quote=true) }}"
#   when: sample_com_challenge is changed and 'sample.com' in sample_com_challenge.challenge_data
#
# Alternative way:
#
# - name: Create DNS records for dns-01 challenges
#   community.aws.route53:
#     zone: sample.com
#     record: "{{ item.key }}"
#     type: TXT
#     ttl: 60
#     state: present
#     wait: true
#     # Note: item.value is a list of TXT entries, and route53
#     # requires every entry to be enclosed in quotes
#     value: "{{ item.value | map('community.dns.quote_txt', always_quote=true) | 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: [email protected]
    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: [email protected]
    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

字符串

ACME 帐户 URI。

返回:已更改

all_chains

列表 / 元素=字典

retrieve_all_alternates 设置为 true 时,模块将查询 ACME 服务器以获取备用链。此返回值将包含服务器返回的所有链的列表,其中第一个条目是服务器返回的主链。

详情请参阅 RFC8555 的 7.4.2 节

返回:当检索证书且 retrieve_all_alternates 设置为 true

cert

字符串

叶证书本身,采用 PEM 格式。

返回:始终

chain

字符串

证书链,不包括根证书,作为连接的 PEM 证书。

返回:始终

full_chain

字符串

证书链,不包括根证书,但包括叶证书,作为连接的 PEM 证书。

返回:始终

authorizations

字典

ACME 授权数据。

将标识符映射到 ACME 授权对象。请参阅 https://tools.ietf.org/html/rfc8555#section-7.1.4

返回:已更改

示例:{"example.com": {"challenges": [{"status": "valid", "token": "A5b1C3d2E9f8G7h6", "type": "http-01", "url": "https://example.org/acme/challenge/12345", "validated": "2022-08-01T01:01:02.34Z"}], "expires": "2022-08-04T01:02:03.45Z", "identifier": {"type": "dns", "value": "example.com"}, "status": "valid", "wildcard": false}}

cert_days

整数

证书有效期天数。

返回:成功

challenge_data

字典

每个标识符/挑战类型的挑战数据。

自 Ansible 2.8.5 起,仅返回尚未有效的挑战。

返回:已更改

identifier

字典

对于每个标识符,提供一个挑战类型映射到挑战数据的字典。

此字典中的键是标识符。identifier 是文档中使用的占位符。

请注意,这些键不是有效的 Jinja2 标识符。

返回:已更改

challenge-type

字典

每种挑战类型的的数据。

此字典中的键是挑战类型。challenge-type 是文档中使用的占位符。可能的键是 http-01dns-01tls-alpn-01

请注意,这些键不是有效的 Jinja2 标识符。

返回:已更改

record

字符串

挑战的完整 DNS 记录名称。

返回:已更改且挑战为 dns-01

示例:"_acme-challenge.example.com"

resource

字符串

必须创建以进行验证的挑战资源。

返回:已更改

示例:".well-known/acme-challenge/evaGxfADs6pSRb2LAv9IZf17Dt3juxGJ-PCt92wr-oA"

resource_original

字符串

原始挑战资源,包括 tls-alpn-01 挑战的类型标识符。

返回:已更改且 challengetls-alpn-01

示例:"DNS:example.com"

resource_value

字符串

资源必须为验证生成的值。

对于 http-01dns-01 挑战,该值可以按原样使用。

对于 tls-alpn-01 挑战,请注意,此返回值包含必须放入 acmeValidation x509 扩展中的正确二进制 blob 的 Base64 编码版本;详情请参阅 https://www.rfc-editor.org/rfc/rfc8737.html#section-3。为此,您可能需要 ansible.builtin.b64decode Jinja 过滤器来从此返回值中提取二进制 blob。

返回:已更改

示例:"IlirfxKKXA...17Dt3juxGJ-PCt92wr-oA"

challenge_data_dns

字典

如果挑战是 dns-01,则每个 DNS 记录的 TXT 值列表。

自 Ansible 2.8.5 起,仅返回尚未有效的挑战。

返回:已更改

finalization_uri

字符串

ACME 完成 URI。

返回:已更改

order_uri

字符串

ACME 订单 URI。

返回:已更改

作者

  • Michael Gruener (@mgruener)