全部產品
Search
文件中心

Alibaba Cloud Service Mesh:使用cert-manager管理網關的認證

更新時間:Jun 30, 2024

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