跳到正文
Træfɪk

ACME

配置示例

以下是 Traefik 中 ACME 的基本配置示例。

entryPoints:
  web:
    address: ":80"

  websecure:
    address: ":443"

certificatesResolvers:
  myresolver:
    acme:
      email: [email protected]
      storage: acme.json
      httpChallenge:
        # used during the challenge
        entryPoint: web
[entryPoints]
  [entryPoints.web]
    address = ":80"

  [entryPoints.websecure]
    address = ":443"

[certificatesResolvers.myresolver.acme]
  email = "[email protected]"
  storage = "acme.json"
  [certificatesResolvers.myresolver.acme.httpChallenge]
    # used during the challenge
    entryPoint = "web"
--entryPoints.web.address=:80
--entryPoints.websecure.address=:443
# ...
--certificatesresolvers.myresolver.acme.email=your-email@example.com
--certificatesresolvers.myresolver.acme.storage=acme.json
# used during the challenge
--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web
# Traefik entryPoints configuration for HTTP and HTTPS.
entryPoints:
  web:
    address: ":80"
  websecure:
    address: ":443"

certificatesResolvers:
  myresolver:
    acme:
      email: "[email protected]"
      storage: "/data/acme.json"       # Path to store the certificate information.
      httpChallenge:
        # Entry point to use during the ACME HTTP-01 challenge.
        entryPoint: "web"

配置选项

ACME 证书解析器提供以下配置选项:

字段 说明 默认值 必填
acme.email 用于注册的电子邮件地址。 "" 是
acme.caServer 要使用的 CA 服务器。 https://acme-v02.api.letsencrypt.org/directory 否
acme.preferredChain 优先使用的证书链。如果 CA 提供多条证书链,则优先选择签发者与此主题通用名称匹配的证书链。如果没有匹配项,则使用默认提供的证书链。 "" 否
acme.keyType 要使用的密钥类型。 "RSA4096" 否
acme.disableCommonName 在 CSR 中禁用通用名称。 false 否
acme.profile 要使用的证书签发配置(profile)。 "" 否
acme.caCertificates 指定 PEM 编码的 CA 证书路径。当 ACME 服务器的 HTTPS 证书并非由系统全局可信根列表中的 CA 签发时,可以用这些证书验证该服务器。 [] 否
acme.caSystemCertPool 定义证书池是否必须使用系统证书池的副本。 false 否
acme.caServerName 指定 CA 服务器名称。当 ACME 服务器的 HTTPS 证书并非由系统全局可信根列表中的 CA 签发时,可以用该名称验证服务器。 "" 否
acme.emailAddresses 在 CSR 中使用的电子邮件地址。 [] 否
acme.eab 启用外部账户绑定。 否
acme.eab.kid 外部 CA 提供的密钥标识符。 "" 否
acme.eab.hmacEncoded 外部 CA 提供的 HMAC 密钥,应采用不带填充的 Base64 URL 编码格式。 "" 否
acme.certificatesDuration 证书的有效期,以小时为单位,仅用于确定续期日期。 2160 否
acme.clientTimeout 与 ACME 服务器通信的 HTTP 客户端超时时间。 2m 否
acme.clientResponseHeaderTimeout 与 ACME 服务器通信的 HTTP 客户端等待响应头的超时时间。 30s 否
acme.certificateTimeout 完成请求期间获取证书的超时时间。如果 ACME 服务器签发证书较慢,请设置此项。 30s 否
acme.dnsChallenge 启用 DNS-01 质询。更多信息请参阅此处。 - 否
acme.dnsChallenge.provider 要使用的 DNS 提供者。 "" 否
acme.dnsChallenge.resolvers 用于解析 FQDN 权威信息的 DNS 服务器。 [] 否
acme.dnsChallenge.propagation.delayBeforeChecks 默认情况下,提供者会在交由 ACME 验证之前先验证 DNS 质询 TXT 记录。如果 delayBeforeCheck 大于零,则将此检查延迟所配置的秒数。当内部网络阻止外部 DNS 查询时,此选项很有用。 0s 否
acme.dnsChallenge.propagation.disableChecks 在通知 ACME DNS 质询已就绪之前,禁用对质询 TXT 记录传播情况的检查。请注意,禁用检查可能导致质询无法成功。 false 否
acme.dnsChallenge.propagation.requireAllRNS 要求质询 TXT 记录传播到所有递归名称服务器。如果已禁用权威名称服务器检查(通过 propagation.disableANSChecks),建议改为检查所有递归名称服务器。 false 否
acme.dnsChallenge.propagation.disableANSChecks 禁用针对权威名称服务器的质询 TXT 记录传播检查。此选项会跳过对权威(SOA)名称服务器的传播检查。仅应在无法访问权威名称服务器时使用。 false 否
acme.httpChallenge 启用 HTTP-01 质询。更多信息请参阅此处。 否
acme.httpChallenge.entryPoint 用于 HTTP-01 质询的入口点。Let's Encrypt 必须能够通过端口 80 访问它。 "" 是
acme.httpChallenge.delay 创建质询与执行验证之间的延迟。小于或等于零表示不延迟。 0 否
acme.tlsChallenge 启用 TLS-ALPN-01 质询。Let's Encrypt 必须能够通过端口 443 访问 Traefik。更多信息请参阅此处。 - 否
acme.tlschallenge.delay 创建质询与执行验证之间的延迟。小于或等于零表示不延迟。 0 否
acme.storage 用于存储证书的文件路径。 "acme.json" 是

自动续期证书

Traefik 会自动跟踪它所生成证书的到期时间。不再使用的证书仍可能被续期,因为 Traefik 目前在续期前不会检查证书是否仍在使用。

默认情况下,Traefik 管理有效期为 90 天的证书,并在到期前 30 天开始续期。 如果使用的证书解析器签发的是自定义有效期的证书,可以通过 certificatesDuration 选项配置证书有效期。

说明

不再使用的证书仍可能被续期,因为 Traefik 目前在续期前不会检查证书是否仍在使用。

不同的 ACME 质询

dnsChallenge

DNS-01 质询通过配置 DNS 记录来生成和续期 ACME 证书。

Traefik 内部依赖 Lego 实现 ACME。 你可以在其文档中找到所有受支持的 DNS 提供者列表, 以及需要设置哪些环境变量的说明。

说明

支持使用 CNAME,甚至推荐这样做。

如果需要,可以通过以下环境变量关闭 CNAME 支持:

LEGO_DISABLE_CNAME_SUPPORT=true
多个 DNS 质询

Traefik 不支持使用多个 DNS 质询提供者,但可以通过 CNAME 处理这种情况。 例如,如果你拥有 example.org(账户 foo)和 example.com(账户 bar),可以在 example.org 上创建名为 _acme-challenge.example.org 的 CNAME,指向 challenge.example.com。 这样就能使用 bar 账户获取 example.org 的证书。

delayBeforeChecks

默认情况下,provider 会在交由 ACME 验证_之前_先验证 TXT 记录。 可以通过 delayBeforeChecks 指定延迟时间(单位为秒,值必须大于零),以推迟此操作。 当内部网络阻止外部 DNS 查询时,此选项很有用。

tlsChallenge

使用 TLS-ALPN-01 质询,通过配置 TLS 证书来生成和续期 ACME 证书。

如 Let's Encrypt 社区论坛所述, 使用 TLS-ALPN-01 质询时,Let's Encrypt 必须能够通过端口 443 访问 Traefik。

配置 tlsChallenge
certificatesResolvers:
  myresolver:
    acme:
      # ...
      tlsChallenge: {}
[certificatesResolvers.myresolver.acme]
  # ...
  [certificatesResolvers.myresolver.acme.tlsChallenge]
# ...
--certificatesresolvers.myresolver.acme.tlschallenge=true

httpChallenge

使用 HTTP-01 质询,通过在约定的 URI 下提供 HTTP 资源来生成和续期 ACME 证书。

如 Let's Encrypt 社区论坛所述, 使用 HTTP-01 质询时,Let's Encrypt 必须能够通过端口 80 访问 certificatesresolvers.myresolver.acme.httpchallenge.entrypoint。

为 httpChallenge 使用名为 web 的入口点
entryPoints:
  web:
    address: ":80"

  websecure:
    address: ":443"

certificatesResolvers:
  myresolver:
    acme:
      # ...
      httpChallenge:
        entryPoint: web
[entryPoints]
  [entryPoints.web]
    address = ":80"

  [entryPoints.websecure]
    address = ":443"

[certificatesResolvers.myresolver.acme]
  # ...
  [certificatesResolvers.myresolver.acme.httpChallenge]
    entryPoint = "web"
--entryPoints.web.address=:80
--entryPoints.websecure.address=:443
# ...
--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web

重定向与 HTTP-01 质询完全兼容。

域名定义

证书解析器根据以下规则,从路由器推导出一组域名,并为其请求证书:

  • 如果 IngressRoute 设置了 tls.domains 选项, 证书解析器就会从 tls.domains 的 main 选项推导出此路由器的域名。

  • 否则,证书解析器会从 IngressRoute 规则中的任意 Host() 或 HostSNI() 匹配器 推导出域名。

可以为每个主域名设置 SAN(备用域名)。 每个域名都必须有指向 Traefik 的 A/AAAA 记录。 每个域名和 SAN 都会触发一次证书请求。

ACME v2 支持通配符证书。 如 Let's Encrypt 的文章所述,通配符证书只能通过 DNS-01 质询生成。 无法为域名申请双重通配符证书(例如 *.*.local.com)。

通常也需要为根域名签发证书,因此必须将其指定为 SAN,此时会发起 2 次 DNS-01 质询。 在这种情况下,为两个域名生成的 DNS TXT 记录是相同的。 尽管这种行为符合 DNS RFC, 但仍可能引发问题:所有 DNS 提供者都会将 DNS 记录缓存一段时间(TTL),而这个 TTL 可能长于质询超时时间,导致 DNS-01 质询失败。

Traefik 使用的 ACME 客户端库 lego 为部分 DNS 提供者提供了解决此问题的支持,但并非全部。 受支持的 provider 表会注明是否允许为通配符域名及其根域名生成证书。

通配符域名

ACME V2 支持通配符证书。 如 Let's Encrypt 的文章所述,通配符证书只能通过 DNS-01 质询生成。

外部账户绑定

  • kid:外部 CA 提供的密钥标识符
  • hmacEncoded:外部 CA 提供的 HMAC 密钥,应采用不带填充的 Base64 URL 编码格式
certificatesResolvers:
  myresolver:
    acme:
      # ...
      eab:
        kid: abc-keyID-xyz
        hmacEncoded: abc-hmac-xyz
[certificatesResolvers.myresolver.acme]
  # ...
  [certificatesResolvers.myresolver.acme.eab]
    kid = "abc-keyID-xyz"
    hmacEncoded = "abc-hmac-xyz"
# ...
--certificatesresolvers.myresolver.acme.eab.kid=abc-keyID-xyz
--certificatesresolvers.myresolver.acme.eab.hmacencoded=abc-hmac-xyz

在 Kubernetes 中使用 LetsEncrypt

在 kubernetes 中使用 LetsEncrypt 时,Ingress 和 CRD 提供者都有一些已知的注意事项。

说明

如果计划运行多个启用 LetsEncrypt 的 Traefik 实例,请务必阅读对应提供者页面中的相关章节。

Ingress 提供者对 LetsEncrypt 的支持

Traefik 被设计为无状态应用, 这意味着它仅从运行环境中推导配置, 不需要额外配置。 因此,用户可以同时运行多个 Traefik 实例, 实现高可用(HA),这也是 kubernetes 生态系统中的常见模式。

在单个 Traefik Proxy 实例中使用 Let's Encrypt 时, 通常不会遇到问题,但这可能成为单点故障。 遗憾的是,无法同时运行多个启用了 Let's Encrypt 的 Traefik 2.0 实例, 因为无法确保正确的 Traefik 实例收到质询请求 及后续响应。 早期版本(v1.x)的 Traefik 曾尝试通过 KV 存储 实现这一点,但该功能性能不佳, 因此在 2.0 中被移除。

如果需要在 Kubernetes 环境中以高可用方式使用 Let's Encrypt, 建议使用 Traefik Enterprise, 它将分布式 Let's Encrypt 作为受支持的功能提供。

如果希望继续使用 Traefik Proxy, 可以通过 Cert-Manager 等证书控制器实现 LetsEncrypt 高可用。 使用 Cert-Manager 管理证书时, 它会在你的命名空间中创建 Secret,这些 Secret 可以在 Ingress 对象 中作为 TLS Secret 引用。

回退

如果无法访问 Let's Encrypt,将按以下顺序使用证书:

  1. 先前生成的 ACME 证书(故障发生前)
  2. 已过期的 ACME 证书
  3. 提供的证书

重要

对于需要通过 Let's Encrypt 验证的新(子)域名,在 Traefik 重启之前会使用默认的 Traefik 证书。


在生产环境使用 Traefik OSS?

如果你在工作中使用 Traefik,可以考虑为 Traefik OSS 增加企业级 API 网关能力或商业支持。

为 Traefik OSS 增加 API 网关能力快捷且平滑,无需推倒重来,现有配置也会完整保留。请通过这个简短视频了解实际效果。


版权所有 © 头文件软件工作室

文档由 HeadFile Studio 翻译。

Traefik v3.7 中文快照 · 原文版权归 Traefik Labs 及贡献者所有 · MIT 许可证