TLS 配置¶
网关 API 允许使用多种方法配置 TLS。本文档介绍了各种 TLS 设置,并提供了有关如何有效使用它们的通用指南。
虽然本文档涵盖了网关 API 中最常见的 TLS 配置形式,但某些实现也可能提供特定于实现的扩展,这些扩展允许使用不同或更高级的 TLS 配置形式。除了本文档之外,您还应该阅读您正在使用网关 API 的任何实现的 TLS 文档。
实验性通道
下面描述的 TLSRoute
和 BackendTLSPolicy
资源目前仅包含在网关 API 的“实验性”通道中。有关发布通道的更多信息,请参阅我们的 版本控制指南。
客户端/服务器和 TLS¶
对于网关,涉及两个连接
- 下游:这是客户端和网关之间的连接。
- 上游:这是网关和路由指定的后台资源之间的连接。这些后台资源通常是服务。
使用网关 API,下游和上游连接的 TLS 配置是独立管理的。
对于下游连接,根据监听器协议,支持不同的 TLS 模式和路由类型。
监听器协议 | TLS 模式 | 支持的路由类型 |
---|---|---|
TLS | 直通 | TLSRoute |
TLS | 终止 | TCPRoute |
HTTPS | 终止 | HTTPRoute |
GRPC | 终止 | GRPCRoute |
请注意,在 直通
TLS 模式的情况下,不会生效任何 TLS 设置,因为来自客户端的 TLS 会话不会在网关处终止,而是会以加密形式通过网关。
对于上游连接,使用 BackendTLSPolicy
,监听器协议和 TLS 模式均不适用于上游 TLS 配置。对于 HTTPRoute
,支持使用 终止
TLS 模式和 BackendTLSPolicy
。将两者结合使用可以提供通常称为在网关处终止然后重新加密的连接。
下游 TLS¶
下游 TLS 设置是使用网关级别的监听器配置的。
监听器和 TLS¶
监听器在每个域或子域的基础上公开 TLS 设置。监听器的 TLS 设置将应用于满足 hostname
条件的所有域。
在以下示例中,网关为所有请求提供 default-cert
Secret 资源中定义的 TLS 证书。虽然示例指的是 HTTPS 协议,但您也可以将相同的功能用于 TLS 协议以及 TLSRoutes。
listeners:
- protocol: HTTPS # Other possible value is `TLS`
port: 443
tls:
mode: Terminate # If protocol is `TLS`, `Passthrough` is a possible mode
certificateRefs:
- kind: Secret
group: ""
name: default-cert
示例¶
具有不同证书的监听器¶
在此示例中,网关配置为提供 foo.example.com
和 bar.example.com
域。这些域的证书在网关中指定。
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: tls-basic
spec:
gatewayClassName: example
listeners:
- name: foo-https
protocol: HTTPS
port: 443
hostname: foo.example.com
tls:
certificateRefs:
- kind: Secret
group: ""
name: foo-example-com-cert
- name: bar-https
protocol: HTTPS
port: 443
hostname: bar.example.com
tls:
certificateRefs:
- kind: Secret
group: ""
name: bar-example-com-cert
通配符 TLS 监听器¶
在此示例中,网关配置了 *.example.com
的通配符证书和 foo.example.com
的不同证书。由于特定匹配优先,因此网关将为对 foo.example.com
的请求提供 foo-example-com-cert
,为所有其他请求提供 wildcard-example-com-cert
。
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: wildcard-tls-gateway
spec:
gatewayClassName: example
listeners:
- name: foo-https
protocol: HTTPS
port: 443
hostname: foo.example.com
tls:
certificateRefs:
- kind: Secret
group: ""
name: foo-example-com-cert
- name: wildcard-https
protocol: HTTPS
port: 443
hostname: "*.example.com"
tls:
certificateRefs:
- kind: Secret
group: ""
name: wildcard-example-com-cert
跨命名空间证书引用¶
在此示例中,网关配置为引用不同命名空间中的证书。这可以通过在目标命名空间中创建的 ReferenceGrant 允许。如果没有 ReferenceGrant,跨命名空间引用将无效。
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: cross-namespace-tls-gateway
namespace: gateway-api-example-ns1
spec:
gatewayClassName: example
listeners:
- name: https
protocol: HTTPS
port: 443
hostname: "*.example.com"
tls:
certificateRefs:
- kind: Secret
group: ""
name: wildcard-example-com-cert
namespace: gateway-api-example-ns2
---
apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata:
name: allow-ns1-gateways-to-ref-secrets
namespace: gateway-api-example-ns2
spec:
from:
- group: gateway.networking.k8s.io
kind: Gateway
namespace: gateway-api-example-ns1
to:
- group: ""
kind: Secret
上游 TLS¶
上游 TLS 设置是使用附加到服务的实验性 BackendTLSPolicy
通过目标引用配置的。
此资源可用于描述网关应用于连接后端的服务名称指示 (SNI) 以及如何验证后端 Pod 提供的证书。
TargetRefs 和 TLS¶
BackendTLSPolicy 包含 TargetRefs
和 Validation
的规范。TargetRefs 是必需的,它标识了 HTTPRoute 需要 TLS 的一个或多个服务。Validation
配置包含一个必需的 Hostname
,以及 CACertificateRefs
或 WellKnownCACertificates
。
Hostname 指的是网关应用于连接后端的 SNI,并且必须与后端 Pod 提供的证书匹配。
CACertificateRefs 指的是一个或多个 PEM 编码的 TLS 证书。如果没有要使用的特定证书,则必须将 WellKnownCACertificates 设置为“系统”,以指示网关使用一组受信任的 CA 证书。每个实现使用的系统证书可能有所不同。有关更多信息,请参阅您所选实现的文档。
限制
- 不允许跨命名空间证书引用。
- 不允许使用通配符主机名。
示例¶
使用系统证书¶
在此示例中,BackendTLSPolicy
配置为使用系统证书连接到一个 TLS 加密的上游连接,其中支持 dev
服务的 Pod 预计将为 dev.example.com
提供有效的证书。
apiVersion: gateway.networking.k8s.io/v1alpha3
kind: BackendTLSPolicy
metadata:
name: tls-upstream-dev
spec:
targetRefs:
- kind: Service
name: dev
group: ""
validation:
wellKnownCACertificates: "System"
hostname: dev.example.com
使用显式 CA 证书¶
在此示例中,BackendTLSPolicy
配置为使用在配置映射 auth-cert
中定义的证书连接到一个 TLS 加密的上游连接,其中支持 auth
服务的 Pod 预计将为 auth.example.com
提供有效的证书。
apiVersion: gateway.networking.k8s.io/v1alpha3
kind: BackendTLSPolicy
metadata:
name: tls-upstream-auth
spec:
targetRefs:
- kind: Service
name: auth
group: ""
validation:
caCertificateRefs:
- kind: ConfigMap
name: auth-cert
group: ""
hostname: auth.example.com
扩展¶
网关 TLS 配置提供了一个 options
映射,以添加特定于实现的功能的附加 TLS 设置。这里可以包含的特征示例包括 TLS 版本限制或要使用的密码。