跳至内容

TLS 配置

网关 API 允许使用多种方法配置 TLS。本文档介绍了各种 TLS 设置,并提供了有关如何有效使用它们的通用指南。

虽然本文档涵盖了网关 API 中最常见的 TLS 配置形式,但某些实现也可能提供特定于实现的扩展,这些扩展允许使用不同或更高级的 TLS 配置形式。除了本文档之外,您还应该阅读您正在使用网关 API 的任何实现的 TLS 文档。

实验性通道

下面描述的 TLSRouteBackendTLSPolicy 资源目前仅包含在网关 API 的“实验性”通道中。有关发布通道的更多信息,请参阅我们的 版本控制指南

客户端/服务器和 TLS

overview

对于网关,涉及两个连接

  • 下游:这是客户端和网关之间的连接。
  • 上游:这是网关和路由指定的后台资源之间的连接。这些后台资源通常是服务。

使用网关 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.combar.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 包含 TargetRefsValidation 的规范。TargetRefs 是必需的,它标识了 HTTPRoute 需要 TLS 的一个或多个服务。Validation 配置包含一个必需的 Hostname,以及 CACertificateRefsWellKnownCACertificates

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 版本限制或要使用的密码。