×

安全路由能够使用多种类型的 TLS 终止来向客户端提供证书。以下部分描述如何使用自定义证书创建重新加密、边缘和直通路由。

如果通过公共端点在 Microsoft Azure 中创建路由,则资源名称会受到限制。您不能创建使用某些术语的资源。有关 Azure 限制的术语列表,请参阅 Azure 文档中的解决保留资源名称错误

使用自定义证书创建重新加密路由

您可以使用oc create route命令配置使用自定义证书和重新加密 TLS 终止的安全路由。

先决条件
  • 您必须拥有 PEM 编码文件的证书/密钥对,其中证书对路由主机有效。

  • 您可能拥有一个单独的 PEM 编码文件的 CA 证书,以完成证书链。

  • 您必须拥有一个单独的 PEM 编码文件的目标 CA 证书。

  • 您必须拥有要公开的服务。

不支持密码保护的密钥文件。要从密钥文件中删除密码,请使用以下命令

$ openssl rsa -in password_protected_tls.key -out tls.key
步骤

此步骤使用自定义证书和重新加密 TLS 终止创建Route资源。以下假设证书/密钥对位于当前工作目录中的tls.crttls.key文件中。您还必须指定目标 CA 证书才能使 Ingress Controller 信任服务的证书。如果需要完成证书链,您也可以指定 CA 证书。请将实际路径名称替换为tls.crttls.keycacert.crt和(可选)ca.crt。将要公开的Service资源的名称替换为frontend。将相应的主机名替换为www.example.com

  • 使用重新加密 TLS 终止和自定义证书创建安全的Route资源

    $ oc create route reencrypt --service=frontend --cert=tls.crt --key=tls.key --dest-ca-cert=destca.crt --ca-cert=ca.crt --hostname=www.example.com

    如果您检查生成的Route资源,它应该类似于以下内容

    安全路由的 YAML 定义
    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
      name: frontend
    spec:
      host: www.example.com
      to:
        kind: Service
        name: frontend
      tls:
        termination: reencrypt
        key: |-
          -----BEGIN PRIVATE KEY-----
          [...]
          -----END PRIVATE KEY-----
        certificate: |-
          -----BEGIN CERTIFICATE-----
          [...]
          -----END CERTIFICATE-----
        caCertificate: |-
          -----BEGIN CERTIFICATE-----
          [...]
          -----END CERTIFICATE-----
        destinationCACertificate: |-
          -----BEGIN CERTIFICATE-----
          [...]
          -----END CERTIFICATE-----

    有关更多选项,请参见oc create route reencrypt --help

使用自定义证书创建边缘路由

您可以使用oc create route命令配置使用自定义证书和边缘 TLS 终止的安全路由。使用边缘路由,Ingress Controller 会在将流量转发到目标 Pod 之前终止 TLS 加密。路由指定 Ingress Controller 用于路由的 TLS 证书和密钥。

先决条件
  • 您必须拥有 PEM 编码文件的证书/密钥对,其中证书对路由主机有效。

  • 您可能拥有一个单独的 PEM 编码文件的 CA 证书,以完成证书链。

  • 您必须拥有要公开的服务。

不支持密码保护的密钥文件。要从密钥文件中删除密码,请使用以下命令

$ openssl rsa -in password_protected_tls.key -out tls.key
步骤

此步骤使用自定义证书和边缘 TLS 终止创建Route资源。以下假设证书/密钥对位于当前工作目录中的tls.crttls.key文件中。如果需要完成证书链,您也可以指定 CA 证书。请将实际路径名称替换为tls.crttls.key和(可选)ca.crt。将要公开的服务的名称替换为frontend。将相应的主机名替换为www.example.com

  • 使用边缘 TLS 终止和自定义证书创建安全的Route资源。

    $ oc create route edge --service=frontend --cert=tls.crt --key=tls.key --ca-cert=ca.crt --hostname=www.example.com

    如果您检查生成的Route资源,它应该类似于以下内容

    安全路由的 YAML 定义
    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
      name: frontend
    spec:
      host: www.example.com
      to:
        kind: Service
        name: frontend
      tls:
        termination: edge
        key: |-
          -----BEGIN PRIVATE KEY-----
          [...]
          -----END PRIVATE KEY-----
        certificate: |-
          -----BEGIN CERTIFICATE-----
          [...]
          -----END CERTIFICATE-----
        caCertificate: |-
          -----BEGIN CERTIFICATE-----
          [...]
          -----END CERTIFICATE-----

    有关更多选项,请参见oc create route edge --help

创建直通路由

您可以使用oc create route命令配置使用直通终止的安全路由。使用直通终止,加密流量将直接发送到目标,而无需路由器提供 TLS 终止。因此,路由上不需要密钥或证书。

先决条件
  • 您必须拥有要公开的服务。

步骤
  • 创建Route资源

    $ oc create route passthrough route-passthrough-secured --service=frontend --port=8080

    如果您检查生成的Route资源,它应该类似于以下内容

    使用直通终止的安全路由
    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
      name: route-passthrough-secured (1)
    spec:
      host: www.example.com
      port:
        targetPort: 8080
      tls:
        termination: passthrough (2)
        insecureEdgeTerminationPolicy: None (3)
      to:
        kind: Service
        name: frontend
    1 对象的名称,最多 63 个字符。
    2 termination字段设置为passthrough。这是唯一必需的tls字段。
    3 可选insecureEdgeTerminationPolicy。唯一有效的值为NoneRedirect或空(禁用)。

    目标 Pod 负责为端点流量提供证书服务。目前,这是唯一能够支持客户端证书(也称为双向认证)的方法。

创建使用外部管理证书的路由

使用 TLS 密钥中的外部证书保护路由仅为技术预览功能。技术预览功能不受 Red Hat 生产服务级别协议 (SLA) 的支持,并且可能功能不完整。Red Hat 不建议在生产环境中使用它们。这些功能可让您提前访问即将推出的产品功能,使客户能够在开发过程中测试功能并提供反馈。

有关 Red Hat 技术预览功能的支持范围的更多信息,请参阅 技术预览功能支持范围

您可以通过使用路由 API 的.spec.tls.externalCertificate字段,使用第三方证书管理解决方案配置 OpenShift Container Platform 路由。您可以通过密钥引用外部管理的 TLS 证书,无需手动管理证书。使用外部管理的证书可以减少错误,确保证书更新更平滑地推出,使 OpenShift 路由器能够及时提供更新的证书。

此功能适用于边缘路由和重新加密路由。

先决条件
  • 您必须启用RouteExternalCertificate功能开关。

  • 您必须对routes/custom-host具有createupdate权限。

  • 您必须拥有一个密钥,其中包含 PEM 编码格式的有效证书/密钥对,类型为kubernetes.io/tls,其中包括tls.keytls.crt密钥。

  • 您必须将引用的密钥放在与要保护的路由相同的命名空间中。

步骤
  1. 通过运行以下命令,在与密钥相同的命名空间中创建一个role,以允许路由器服务帐户读取访问权限

    $ oc create role secret-reader --verb=get,list,watch --resource=secrets --resource-name=<secret-name> \ (1)
    --namespace=<current-namespace> (2)
    
    1 指定密钥的实际名称。
    2 指定密钥和路由所在的命名空间。
  2. 通过运行以下命令,在与密钥相同的命名空间中创建一个rolebinding,并将路由器服务帐户绑定到新创建的角色

    $ oc create rolebinding secret-reader-binding --role=secret-reader --serviceaccount=openshift-ingress:router --namespace=<current-namespace> (1)
    1 指定密钥和路由所在的命名空间。
  3. 创建一个 YAML 文件,定义route并使用以下示例指定包含证书的密钥。

    安全路由的 YAML 定义
    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
      name: myedge
      namespace: test
    spec:
      host: myedge-test.apps.example.com
      tls:
        externalCertificate:
          name: <secret-name> (1)
        termination: edge
        [...]
    [...]
    1 指定密钥的实际名称。
  4. 通过运行以下命令创建route资源

    $ oc apply -f <route.yaml> (1)
    1 指定生成的 YAML 文件名。

如果密钥存在且具有证书/密钥对,则如果满足所有先决条件,路由器将提供生成的证书。

如果未提供.spec.tls.externalCertificate,路由器将使用默认生成的证书。

使用.spec.tls.externalCertificate字段时,不能提供.spec.tls.certificate字段或.spec.tls.key字段。

其他资源
  • 要对使用外部管理证书的路由进行故障排除,请检查 OpenShift Container Platform 路由器 Pod 日志中的错误,请参阅 调查 Pod 问题