DNS01¶
配置 DNS01 挑战提供程序¶
本页包含有关Issuer源的 DNS01 挑战解决程序配置上可用的不同选项的详细信息。
有关配置 ACMEIssuers 及其 API 格式的更多信息,请阅读ACME 发行者文档。
DNS01 提供程序配置必须在Issuer源上指定,类似于设置文档中的示例。
您可以在Let's Encrypt 挑战类型页面上阅读有关 DNS01 挑战类型的工作原理.
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: example-issuer
spec:
  acme:
    email: user@example.com
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: example-issuer-account-key
    solvers:
      - dns01:
          cloudDNS:
            project: my-project
            serviceAccountSecretRef:
              name: prod-clouddns-svc-acct-secret
              key: service-account.json
每个发行者可以指定多个不同的 DNS01 质询提供者,也可以在一个Issuer上拥有同一个 DNS 提供者的多个实例(例如,可以设置两个 CloudDNS 帐户,每个帐户都有自己的名称)。
有关在单个Issuer上使用多个求解器类型的更多信息,请阅读多求解器类型一节。
设置 DNS01 自检的名称服务器¶
在尝试 DNS01 挑战之前,cert-manager 将检查是否存在正确的 DNS 记录。 默认情况下,cert-manager 将使用从/etc/resolv.conf中获得的递归名称服务器来查询权威名称服务器,然后它将直接查询以验证 DNS 记录的存在。
如果这不是所希望的(例如使用多个权威名称服务器或分割地平线的 DNS), cert-manager 控制器会暴露两个标志,允许您更改此行为:
--dns01-recursive-nameservers cert-manager 应该查询的递归名称服务器的主机和端口的逗号分隔字符串。
--dns01-recursive-nameservers-only 强制 cert-manager 仅使用递归名称服务器进行验证。 启用此选项可能会导致 DNS01 自我检查花费更长的时间,因为递归名称服务器执行缓存。
!!! Example usage:
```bash
--dns01-recursive-nameservers-only --dns01-recursive-nameservers=8.8.8.8:53,1.1.1.1:53
```
如果你正在使用cert-manager helm chart,你可以通过.Values.extraArgs或在 helm 安装/升级时使用--set命令设置递归名称服务器:
--set 'extraArgs={--dns01-recursive-nameservers-only,--dns01-recursive-nameservers=8.8.8.8:53\,1.1.1.1:53}'
DNS01 的委托域¶
缺省情况下,cert-manager 不会跟踪指向子域的 CNAME 记录。
如果不希望授予 cert-manager 对根 DNS 区域的访问权限,那么可以将_acme-challenge.example.com子域委托给其他一些特权较低的域(less-privileged.example.org)。 这可以通过以下方式实现。 比如说,一个有两个区域:
- example.com
-  less-privileged.example.org
-  创建一条 CNAME 记录,指向这个特权较低的域: 
-  授予证书管理器更新特权较低的 less-privileged.example.org区域的权限
-  为更新这个特权较低的区域提供配置/凭据,并在相关的 dns01求解器中添加一个额外的字段。 注意,selector字段仍然适用于原来的example.com,而less-privileged.example.org则提供了凭据。
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  ...
spec:
  acme:
    ...
    solvers:
    - selector:
        dnsZones:
        - 'example.com'
      dns01:
        # Valid values are None and Follow
        cnameStrategy: Follow
        route53:
          region: eu-central-1
          accessKeyID: <Access ID for less-privileged.example.org here>
          hostedZoneID: <Zone ID for less-privileged.example.org here>
          secretAccessKeySecretRef:
            ...
如果您有许多(子)域需要单独的证书,则可以共享一个别名较低特权的域。 要实现它,应该为每个(子)域创建一个 CNAME 记录,如下所示:
_acme-challenge.example.com     IN  CNAME   _acme-challenge.less-privileged.example.org.
_acme-challenge.www.example.com IN  CNAME   _acme-challenge.less-privileged.example.org.
_acme-challenge.foo.example.com IN  CNAME   _acme-challenge.less-privileged.example.org.
_acme-challenge.bar.example.com IN  CNAME   _acme-challenge.less-privileged.example.org.
有了这个配置,cert-manager 将递归地跟踪 CNAME 记录,以确定在 DNS01 挑战期间要更新哪个 DNS 区域。
支持的 DNS01 提供商¶
ACMEIssuer支持许多不同的 DNS 提供程序。 下面是可用的供应商列表,它们的.yaml配置,以及关于它们使用的其他 Kubernetes 和供应商特定注意事项。
Webhook¶
cert-manager 还支持使用外部 webhook 的树外 DNS 提供商。 链接到这些受支持的提供商及其文档如下:
- AliDNS-Webhook
- cert-manager-alidns-webhook
- cert-manager-webhook-civo
- cert-manager-webhook-dnspod
- cert-manager-webhook-dnsimple
- cert-manager-webhook-gandi
- cert-manager-webhook-infomaniak
- cert-manager-webhook-inwx
- cert-manager-webhook-linode
- cert-manager-webhook-oci(Oracle Cloud Infrastructure)
- cert-manager-webhook-scaleway
- cert-manager-webhook-selectel
- cert-manager-webhook-softlayer
- cert-manager-webhook-ibmcis
- cert-manager-webhook-loopia
- cert-manager-webhook-arvan
- bizflycloud-certmanager-dns-webhook
- cert-manager-webhook-hetzner
- cert-manager-webhook-yandex-cloud
- cert-manager-webhook-netcup
你可以在这里找到更多关于如何配置 webhook 提供者的信息。
要创建一个新的不受支持的 DNS 提供程序,请参考开发文档此处.