跳到正文
Træfɪk

TLS Certificates

提示

路由器需要处理 HTTPS 流量时,应在路由器定义中通过 tls 字段指定。

证书定义

自动生成

参阅 Let's Encrypt 页面。

用户定义

要添加或删除 TLS 证书,即使 Traefik 已在运行,也可以将证书定义添加到动态配置的 [[tls.certificates]] 段中:

tls:
  certificates:
    - certFile: /path/to/domain.cert
      keyFile: /path/to/domain.key
    - certFile: /path/to/other-domain.cert
      keyFile: /path/to/other-domain.key
[[tls.certificates]]
  certFile = "/path/to/domain.cert"
  keyFile = "/path/to/domain.key"

[[tls.certificates]]
  certFile = "/path/to/other-domain.cert"
  keyFile = "/path/to/other-domain.key"

限制

上例使用文件提供者处理这些定义。 这是配置证书(以及选项和存储)的唯一可用方法。 但是,在 Kubernetes 中,证书可以且必须通过 Secret 提供。

证书选择(SNI)

Traefik 根据客户端发送的服务器名称指示(SNI),选择在 TLS 握手中出示的证书。

但是,HTTP 路由器规则(如 Host())在 TLS 建立后才进行判断,因此不会影响证书选择。

严格 SNI 检查

默认情况下,如果客户端未发送 SNI,或没有证书匹配所请求的服务器名称, Traefik 会回退到 TLS 存储中的默认证书(如果配置了)。

要拒绝没有 SNI(或服务器名称未知)的连接,而不回退到默认证书, 请在 TLS 选项中启用 sniStrict。

证书存储

在 Traefik 中,证书通过证书存储分组管理。

限制

除默认存储(名为 default)以外的所有存储定义都会被忽略, 因此全局只有一个可用的 TLS 存储。

Kubernetes 中的 TLSStore

使用 TLSStore 资源时,名为 default 的存储适用于所有入口点, 无论它定义在哪个命名空间中。 提供者选项 defaultTLSResourcesNamespace 限制了可定义此集群范围存储的命名空间。

随后可以在 tls.certificates 段中指定存储列表,表明证书应存放在哪里:

tls:
  certificates:
    - certFile: /path/to/domain.cert
      keyFile: /path/to/domain.key
      stores:
        - default
    # Note that since no store is defined,
    # the certificate below will be stored in the `default` store.
    - certFile: /path/to/other-domain.cert
      keyFile: /path/to/other-domain.key
[[tls.certificates]]
  certFile = "/path/to/domain.cert"
  keyFile = "/path/to/domain.key"
  stores = ["default"]

[[tls.certificates]]
  # Note that since no store is defined,
  # the certificate below will be stored in the `default` store.
  certFile = "/path/to/other-domain.cert"
  keyFile = "/path/to/other-domain.key"

限制

实际上,stores 列表会被忽略,并自动设置为 ["default"]。

默认证书

对于没有 SNI 或没有匹配域名的连接,Traefik 可以使用默认证书。 此默认证书应在 TLS 存储中定义:

tls:
  stores:
    default:
      defaultCertificate:
        certFile: path/to/cert.crt
        keyFile: path/to/cert.key
[tls.stores]
  [tls.stores.default]
    [tls.stores.default.defaultCertificate]
      certFile = "path/to/cert.crt"
      keyFile  = "path/to/cert.key"

如果没有提供 defaultCertificate,Traefik 将使用生成的证书。

ACME 默认证书

可以将 Traefik 配置为使用 ACME 提供者(如 Let's Encrypt)生成默认证书。 解析默认证书的配置应在 TLS 存储中定义:

与 defaultGeneratedCert 选项的优先关系

defaultGeneratedCert 定义优先于 ACME 默认证书配置。

tls:
  stores:
    default:
      defaultGeneratedCert:
        resolver: myresolver
        domain:
          main: example.org
          sans:
            - foo.example.org
            - bar.example.org
[tls.stores]
  [tls.stores.default.defaultGeneratedCert]
    resolver = "myresolver"
    [tls.stores.default.defaultGeneratedCert.domain]
      main = "example.org"
      sans = ["foo.example.org", "bar.example.org"]
labels:
  - "traefik.tls.stores.default.defaultgeneratedcert.resolver=myresolver"
  - "traefik.tls.stores.default.defaultgeneratedcert.domain.main=example.org"
  - "traefik.tls.stores.default.defaultgeneratedcert.domain.sans=foo.example.org, bar.example.org"
{
  "Name": "default",
  "Tags": [
    "traefik.tls.stores.default.defaultgeneratedcert.resolver=myresolver",
    "traefik.tls.stores.default.defaultgeneratedcert.domain.main=example.org",
    "traefik.tls.stores.default.defaultgeneratedcert.domain.sans=foo.example.org, bar.example.org"
  ]
}

在生产环境使用 Traefik OSS?

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

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


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

文档由 HeadFile Studio 翻译。

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