跳转至

TLS

传输层安全

证书定义

自动生成证书

可以查看 Let's Encrypt 页面信息。

用户定义

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

# 动态配置

[[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"
# 动态配置

tls:
  certificates:
    - certFile: /path/to/domain.cert
      keyFile: /path/to/domain.key
    - certFile: /path/to/other-domain.cert
      keyFile: /path/to/other-domain.key

限制

在上面的示例中,我们使用 file provider 来处理这些定义。 这些是配置证书(以及可选项和存储)的唯一可用方法。 但是,在 Kubernetes 中,需用通过 secrets 来提供。

证书存储

在 Traefik 中,证书在证书存储下面被分组在一起,其定义如下所示:

# 动态配置

[tls.stores]
  [tls.stores.default]
# 动态配置

tls:
  stores:
    default: {}

限制

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

然后在 tls.certificates 部分,可以指定存储列表来指定证书的存储位置:

# 动态配置

[[tls.certificates]]
  certFile = "/path/to/domain.cert"
  keyFile = "/path/to/domain.key"
  stores = ["default"]

[[tls.certificates]]
  # 注意由于没有定义存储,所以下面证书将被存储在 `default` 存储中。
  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
    # 注意由于没有定义存储,所以下面证书将被存储在 `default` 存储中。
    - certFile: /path/to/other-domain.cert
      keyFile: /path/to/other-domain.key

限制

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

默认证书

对于没有 SNI 或一个特定的域名的连接,Traefik 可以使用默认的证书,该默认证书应在 TLS 存储中定义:

# 动态配置

[tls.stores]
  [tls.stores.default]
    [tls.stores.default.defaultCertificate]
      certFile = "path/to/cert.crt"
      keyFile  = "path/to/cert.key"
# 动态配置

tls:
  stores:
    default:
      defaultCertificate:
        certFile: path/to/cert.crt
        keyFile: path/to/cert.key

如果没有默认证书提供,Traefik 将生成一个自签名的证书。

TLS 选项

TLS 选项允许你配置 TLS 连接的一些参数。

最新 TLS 版本

# 动态配置

[tls.options]

  [tls.options.default]
    minVersion = "VersionTLS12"

  [tls.options.mintls13]
    minVersion = "VersionTLS13"
# 动态配置

tls:
  options:
    default:
      minVersion: VersionTLS12

    mintls13:
      minVersion: VersionTLS13
apiVersion: traefik.containo.us/v1alpha1
kind: TLSOption
metadata:
  name: default
  namespace: default
spec:
  minVersion: VersionTLS12

---
apiVersion: traefik.containo.us/v1alpha1
kind: TLSOption
metadata:
  name: mintls13
  namespace: default
spec:
  minVersion: VersionTLS13

密码套件

可以查看 cipherSuites 了解更多信息。

# 动态配置

[tls.options]
  [tls.options.default]
    cipherSuites = [
      "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
    ]
# 动态配置

tls:
  options:
    default:
      cipherSuites:
        - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
apiVersion: traefik.containo.us/v1alpha1
kind: TLSOption
metadata:
  name: default
  namespace: default
spec:
  cipherSuites:
    - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

TLS 1.3

为 TLS 1.2 及以下版本定义的密码套件不能在 TLS 1.3 中使用,反之亦然。(https://tools.ietf.org/html/rfc8446

使用 TLS 1.3,密码套件不可配置(在这种情况下,所有受支持的密码套件都是安全的)。(https://golang.org/doc/go1.12#tls_1_3)

严格的 SNI 检查

通过严格的 SNI 检查,Traefik 将会拒绝没有指定 server_name 扩展名的客户端的连接。

# 动态配置

[tls.options]
  [tls.options.default]
    sniStrict = true
# 动态配置

tls:
  options:
    default:
      sniStrict: true
apiVersion: traefik.containo.us/v1alpha1
kind: TLSOption
metadata:
  name: default
  namespace: default
spec:
  sniStrict: true

客户端认证 (mTLS)

Traefik 通过 clientAuth 支持相互认证。对于需要验证客户端证书的身份验证策略,应在 clientAuth.caFiles 中设置证书的证书颁发机构。

clientAuth.clientAuthType 选项控制行为如下所示:

  • NoClientCert: 忽略任何客户端证书。
  • RequestClientCert: 要求提供证书,但是如果没有提供的话,也会继续处理。
  • RequireAnyClientCert: 需要证书,但不验证它是否由 clientAuth.caFiles 中列出的 CA 签名。
  • VerifyClientCertIfGiven: 如果提供了一个证书,则验证它是否由 clientAuth.caFiles 中列出的 CA 签名,否则继续进行,无需任何证书。
  • RequireAndVerifyClientCert: 需要一个证书,该证书必须由 clientAuth.caFiles 中列出的 CA 签名。
# 动态配置

[tls.options]
  [tls.options.default]
    [tls.options.default.clientAuth]
      # PEM 格式,每个文件可以包含多个 CA 证书
      caFiles = ["tests/clientca1.crt", "tests/clientca2.crt"]
      clientAuthType = "RequireAndVerifyClientCert"
# 动态配置

tls:
  options:
    default:
      clientAuth:
        # PEM 格式,每个文件可以包含多个 CA 证书
        caFiles:
          - tests/clientca1.crt
          - tests/clientca2.crt
        clientAuthType: RequireAndVerifyClientCert
apiVersion: traefik.containo.us/v1alpha1
kind: TLSOption
metadata:
  name: default
  namespace: default
spec:
  clientAuth:
    secretNames:
      - secretCA
    clientAuthType: RequireAndVerifyClientCert