Skip to content

配置HTTPS使用TLS证书

了解如何在Knative中使用TLS证书配置安全HTTPS连接(TLS取代SSL). 配置安全HTTPS连接,使您的Knative服务和路由能够终止外部TLS连接. 可以配置Knative来处理手动指定的证书,也可以启用Knative来自动获取和更新证书。

您可以使用Certbotcert-manager两种方式获取证书。 这两个工具都支持TLS证书,但如果您想启用Knative来自动发放TLS证书,您必须安装和配置证书管理器工具:

  • 手动获取和更新证书: 可以使用Certbot和cert-manager工具手动获取TLS证书。 通常,在您获得证书后,您必须创建一个Kubernetes秘密以在您的集群中使用该证书。 有关手动获取和配置证书的详细信息,请参见本主题后面的步骤。

  • 启用Knative自动获取和更新TLS证书: 您还可以使用证书管理器配置Knative以自动获取新的TLS证书并更新现有的证书。 如果您希望启用Knative自动发放TLS证书,请参见启用TLS证书自动发放主题。

默认情况下,Let's Encrypt颁发机构(CA)用于演示如何启用HTTPS连接,但是您可以配置Knative使用来自支持ACME协议的CA的任何证书。但是,您必须使用并配置您的证书颁发者使用DNS-01挑战类型.

Warning

Let's Encrypt颁发的证书有效期仅为90天。因此,如果您选择手动获取并配置证书,请确保每个证书都在过期前进行了更新。

在开始之前

启用HTTPS安全连接需要满足以下要求:

  • 必须安装Knative服务。关于安装服务组件的详细信息,请参见Knative安装指南
  • 您必须配置您的Knative集群以使用自定义域.

Warning

Istio只支持每个Kubernetes集群一个证书。 要使用Knative集群为多个域提供服务,必须确保为想要服务的每个域签署了新的或现有的证书。

获取TLS证书

如果您已经有了域的签名证书,请参见手动添加TLS证书了解有关配置Knative集群的详细信息。

如果您需要新的TLS证书,您可以选择使用以下工具之一从Let's Encrypt获取证书:

  • 设置Certbot手动获取Let's Encrypt证书
  • 将cert-manager设置为手动获取证书或自动提供证书

本页涵盖了这两个选项的详细信息。

有关使用其他CA的详细信息,请参见该工具的参考文档:

使用Certbot手动获取Let 's Encrypt证书

请按照以下步骤安装Certbot,并使用该工具从Let's Encrypt手动获取TLS证书。

  1. 按照certbot-auto包装脚本说明安装Certbot。

  2. 使用Certbot在授权过程中通过DNS challenge请求证书:

    ./certbot-auto certonly --manual --preferred-challenges dns -d '*.default.yourdomain.com'
    

其中-d指定你的域。如果你想验证多个域,你可以包含多个标志: -d MY.EXAMPLEDOMAIN.1 -d MY.EXAMPLEDOMAIN.2. 有关更多信息,请参见Cerbot命令行参考。

Certbot工具将引导您通过在这些域中创建TXT记录来验证您是否拥有指定的每个域。

结果: CertBot创建两个文件:

  • Certificate:fullchain.pem
  • Private key: privkey.pem

接下来是什么:

通过创建一个Kubernetes secret将证书和私钥添加到您的Knative集群中.

使用证书管理器获取Let's Encrypt证书

您可以安装并使用cert-manager手动获取证书,或者配置您的Knative集群以自动发放证书:

  • 手动证书: 安装cert-manager后,使用工具手动获取证书。

使用cert-manager手动获取证书:

  1. 安装和配置cert-manager.

  2. 通过创建和使用Kubernetes秘密,继续执行有关手动添加TLS证书的步骤。

  3. 自动证书: 配置Knative使用证书管理器自动获取和更新TLS证书。为这种方法安装和配置证书管理器的步骤在启用自动TLS证书发放主题中有详细介绍。

手动添加TLS证书

如果您有一个现有的证书,或者使用了Certbot或证书管理器工具中的一个来手动获取一个新证书,您可以使用以下步骤将该证书添加到您的Knative集群中。

有关为自动证书发放启用Knative的说明,请参见启用自动TLS证书发放。 否则,请按照相应页签的步骤手动添加证书:

要手动向Knative集群添加TLS证书,必须创建一个Kubernetes secret,然后配置Knative Contour插件。

  1. 创建一个Kubernetes secret 来保存您的TLS证书cert.pem和私钥key.pem,运行以下命令:

    kubectl create -n contour-external secret tls default-cert \
      --key key.pem \
      --cert cert.pem
    

    Note

    注意命名空间和秘密名称。在以后的步骤中您将需要这些。

  2. 要在不同的名称空间中使用此证书和私钥,必须创建一个委托。为此,使用以下模板创建一个YAML文件:

    apiVersion: projectcontour.io/v1
    kind: TLSCertificateDelegation
    metadata:
      name: default-delegation
      namespace: contour-external
    spec:
      delegations:
        - secretName: default-cert
          targetNamespaces:
          - "*"
    
  3. 运行以下命令应用YAML文件:

    kubectl apply -f <filename>.yaml
    
    其中 <filename> 是您在上一步中创建的文件的名称。

  4. 更新Knative Contour插件,当autoTLS被禁用时,使用证书作为备份,通过运行以下命令:

    kubectl patch configmap config-contour -n knative-serving \
      -p '{"data":{"default-tls-secret":"contour-external/default-cert"}}'
    

要手动添加一个TLS证书到您的Knative集群,您需要创建一个Kubernetes secret,然后配置knative-ingress-gateway:

  1. 输入以下命令,创建一个Kubernetes secret来保存您的TLS证书cert.pem和私钥key.pem:
kubectl create --namespace istio-system secret tls tls-cert \
  --key key.pem \
  --cert cert.pem
  1. 配置Knative使用您为HTTPS连接创建的新秘密:

  2. 以编辑模式打开Knative共享的gateway:

    kubectl edit gateway knative-ingress-gateway --namespace knative-serving
    
  3. 更新gateway以包含以下tls:部分和配置:

    tls:
      mode: SIMPLE
      credentialName: tls-cert
    

    实例:

    # Edit the following object. Lines beginning with a '#' will be ignored.
    # An empty file will abort the edit. If an error occurs while saving this
    # file will be reopened with the relevant failures.
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      # ... skipped ...
    spec:
      selector:
        istio: ingressgateway
      servers:
        - hosts:
            - "*"
          port:
            name: http
            number: 80
            protocol: HTTP
        - hosts:
            - TLS_HOSTS
          port:
            name: https
            number: 443
            protocol: HTTPS
          tls:
            mode: SIMPLE
            credentialName: tls-cert
    
    在本例中,TLS_HOSTS表示TLS证书的主机。 它可以是单个主机、多个主机或通配符主机。 有关详细说明,请参阅Istio文档

接下来是什么:

在Knative集群上运行更改之后,可以开始使用HTTPS协议来安全访问部署的Knative服务。

Back to top

We use analytics and cookies to understand site traffic. Information about your use of our site is shared with Google for that purpose. Learn more.

× OK