使用cert-manager管理网关的证书

cert-manager是一个证书生命周期管理系统,支持证书的申请、部署等功能。您可以使用cert-manager颁发ASM网关的证书,从而可以使用HTTPS协议通过ASM网关访问服务,保证数据传输的安全。本文介绍如何使用cert-manager管理网关的证书。

背景信息

cert-manager支持签发自签名证书和DNS域名证书,从而可以使用HTTPS协议通过ASM网关访问服务。这两种证书的区别如下:

  • 自签名证书:自签名证书仅具有加密功能,无身份验证功能。您可以在命令行工具中使用HTTPS协议访问ASM网关,但是自签名证书不受Web浏览器的信任,Web浏览器检查HTTPS连接会标记为潜在风险并弹出错误消息,即无法在Web浏览器中使用HTTPS协议通过ASM网关访问服务。

  • DNS域名证书:DNS域名证书由受信任的CA机构颁发,兼具加密和身份验证功能。相比自签名证书,DNS域名证书具有更高的安全性,受到Web浏览器的信任。您可以同时在命令行工具和Web浏览器中使用HTTPS协议通过ASM网关访问服务。

说明

若您在ASM数据面集群中使用cert-manager时报错,可以加入钉群(钉群号:30421250)进行咨询。

前提条件

在集群中安装cert-manager

  1. 在本地安装Helm。具体操作,请参见Helm

  2. 使用kubectl连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群

  3. 执行以下命令,创建cert-manager命名空间。

    kubectl create namespace cert-manager
  4. 执行以下命令,添加cert-manager Chart。

    helm repo add jetstack https://charts.jetstack.io
  5. 执行以下命令,获取cert-manager Chart的最新信息。

    helm repo update
  6. 执行以下命令,安装cert-manager。

    说明

    cert-manager的版本需要和Kubernetes版本保持兼容。关于cert-manager和Kubernetes版本的对应关系,请参见Supported Releases

    helm install \
      cert-manager jetstack/cert-manager \
      --namespace cert-manager \
      --version v1.14  \
      --set installCRDs=true

使用cert-manager签发自签名证书

步骤一:在集群中生成自签证书

  1. 使用以下内容,创建issuer.yaml

    展开查看issuer.yaml

    apiVersion: cert-manager.io/v1
    kind: Issuer
    metadata:
      name: selfsigned
    spec:
      selfSigned: {}
    ---
    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: istio-ingressgateway-certs
    spec:
      isCA: true
      duration: 2160h # 90d
      secretName: istio-ingressgateway-certs
      commonName: istio-ingressgateway-certs
      subject:
        organizations:
        - cluster.local
        - cert-manager
      issuerRef:
        name: selfsigned
        kind: Issuer
        group: cert-manager.io
  2. 执行以下命令,创建自签名CA来颁发工作负载证书。

    kubectl apply -f issuer.yaml -n istio-system
  3. 执行以下命令,查看证书。

    kubectl get secret -n istio-system 

    预期输出:

    NAME                                        TYPE                             DATA         AGE
    istio-ingressgateway-certs                  kubernetes.io/tls                3            68m

步骤二:验证使用HTTPS协议访问服务是否成功

  1. 部署httpbin应用。具体操作,请参见部署httpbin应用

  2. 修改httpbin应用对应的网关规则。

    您可以使用ASM的KubeConfig在命令行进行操作,或者登录ASM控制台,在网关规则页面修改YAML。具体操作,请参见管理网关规则

    修改后的YAML示例如下。在443端口增加了HTTPS协议的监听,并且使用了cert-manager创建的证书。

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: httpbin
      namespace: default
    spec:
      selector:
        istio: ingressgateway
      servers:
        - hosts:
            - '*'
          port:
            name: test
            number: 80
            protocol: HTTP
        - hosts:
            - '*'
          port:
            name: https
            number: 443
            protocol: HTTPS
          tls:
            credentialName: istio-ingressgateway-certs
            mode: SIMPLE
  3. 执行以下命令,在集群中获取入口网关的IP地址。

    kubectl get svc -n istio-system -l istio=ingressgateway
  4. 执行以下命令,通过HTTPS协议访问httpbin应用。

    curl -k --resolve istio-ingressgateway-certs:443:${ASM网关IP} https://istio-ingressgateway-certs/status/418 -I

    访问成功后,您可以看到返回了418状态码。此处访问ASM网关使用的域名是istio-ingressgateway-certs,这是因为之前创建Certificate时,使用的commonNameistio-ingressgateway-certs