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