全部產品
Search
文件中心

Container Compute Service:配置HTTPS認證以實現加密通訊

更新時間:Dec 11, 2024

使用HTTPS協議的監聽時,您需要配置SSL/TLS認證以確保監聽與用戶端的加密串連。本文介紹ALB Ingress支援的多種配置認證的方法。

認證配置方式對比

ALB Ingress支援三種配置認證的方式:自動探索認證、Secret認證和ALBConfig指定認證。三種配置方式的對比如下。

對比項

自動探索認證

ALBConfig指定認證

Secret認證

憑證存放區方式

阿里雲數位憑證中心。

叢集內的Secret資源。

認證發現方式

使用網域名稱匹配自動探索。

通過數位憑證中心產生的認證ID發現。

指定叢集內的Secret資摘要搜索。

適用情境

適用於已在阿里雲數位憑證中心購買認證或上傳認證的情境。

適用於需要在叢集內部管理憑證的情境,例如使用cert-manager類的管理工具時。

跨命名空間使用

支援。

不支援,僅支援在Secret資源所處的命名空間使用。

更新認證方式

數位憑證管理服務控制台上傳新認證或續約認證後,更新Ingress資源。

更新Secret資源的內容。

重要

單個ALB執行個體支援的認證上限為25個。通常情況下,單個ALB執行個體所使用的認證數量等於此ALB執行個體所有監聽的認證數量之和(包括關聯在Ingress資源上的認證)。具體的計算方法,請參見ALB配額計算方式

認證管理方式相容性說明

如果同時使用了多種認證配置方式,認證的管理方式和相容性如下所示。

認證配置情況

說明

在Ingress中同時使用了自動探索認證和Secret認證。

  • 如果自動探索認證和Secret認證屬於同一網域名稱,那麼Secret認證具有更高的優先順序。

  • 如果自動探索認證和Secret認證屬於不同的網域名稱,那麼ALB Ingress Controller會為每個網域名稱分別選擇相應的認證。

同時使用了自動探索認證和ALBConfig指定認證,並且它們關聯的Listener相同。

如果在ALBConfig中指定了認證,則此Listener不會使用自動探索認證。

同時使用了Secret認證和ALBConfig指定認證,並且它們關聯的Listener相同。

ALBConfig指定認證和Secret認證是可以完全相容的,並且可以同時使用。

前提條件

  • 已建立ALBConfig資源,並在ALBConfig中建立HTTPS監聽。具體操作,請參見ALB Ingress快速入門

  • 已擷取到可信的數位憑證。您可以從以下幾個途徑擷取數位憑證:

(可選)步驟一:產生自我簽署憑證

如果還未擷取認證,執行以下命令可以通過OpenSSL建立自我簽署憑證。

重要

由於缺乏可靠的CA認證,自我簽署憑證在瀏覽器和用戶端中預設不受信任,通常會導致客戶在訪問時收到安全警告。本文中產生的自我簽署憑證僅作為樣本,請勿在生產環境中使用。

openssl genrsa -out albtop-key.pem 4096
openssl req -subj "/CN=demo.alb.ingress.top" -sha256  -new -key albtop-key.pem -out albtop.csr  # demo.alb.ingress.top可替換為您的網域名稱
echo subjectAltName = DNS:demo.alb.ingress.top > extfile.cnf  # demo.alb.ingress.top可替換為您的網域名稱
openssl x509 -req -days 3650 -sha256 -in albtop.csr -signkey albtop-key.pem -out albtop-cert.pem -extfile extfile.cnf
說明

命令中的demo.alb.ingress.top是產生的自我簽署憑證所關聯的網域名稱。如果您已擁有自己的網域名稱,請進行替換。

步驟二:建立樣本資源

除了ALBConfig外,ALB Ingress還需要Deployment、Service、IngressClass、Ingress這4種資源才能正常工作,您可以使用以下樣本快速建立這4種資源。

  1. 建立https-quickstart.yaml檔案,並將以下內容拷貝到該檔案中並儲存。

    展開查看YAML內容

    apiVersion: networking.k8s.io/v1
    kind: IngressClass
    metadata:
      name: https-ingressclass
    spec:
      controller: ingress.k8s.alibabacloud/alb
      parameters:
        apiGroup: alibabacloud.com
        kind: AlbConfig
        name: alb # 修改為AlbConfig資源的名稱
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: https-ingress
    spec:
      ingressClassName: https-ingressclass
      rules:
      - host: demo.alb.ingress.top # demo.alb.ingress.top替換為認證關聯的網域名稱
        http:
          paths:
          - backend:
              service:
                name: https-svc
                port:
                  number: 443
            path: /
            pathType: Prefix
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: https-deploy
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: https-deploy
      template:
        metadata:
          labels:
            app: https-deploy
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/acs-sample/old-nginx:latest
              imagePullPolicy: IfNotPresent
              name: https-deploy
              ports:
                - containerPort: 80
                  protocol: TCP
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: https-svc
    spec:
      ports:
        - name: port1
          port: 443
          protocol: TCP
          targetPort: 80
      selector:
        app: https-deploy
      sessionAffinity: None
      type: ClusterIP
  2. (可選)如果在ALBConfig中同時配置了使用HTTP協議的監聽與使用HTTPS協議的監聽,請在Ingress中添加annotations欄位,以保證Ingress同時適用於多個監聽,修改內容如下:

    使用多個監聽時添加annotations

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: https-ingress
      annotations:
        alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]' # 使用多個監聽時需要添加annotation使ALB Ingress正常工作
    spec:
      #...
  3. 執行以下命令建立。

    kubectl apply -f https-quickstart.yaml

步驟三:配置認證

使用自動探索認證

在將認證上傳到阿里雲數位憑證中心後,您可以通過在Ingress中的tls欄位裡填入認證關聯的網域名稱,使ALB Ingress自動探索並使用已上傳的認證。

  1. 將自我簽署憑證上傳至阿里雲數位憑證中心。具體操作,請參見上傳和共用SSL認證

  2. 更新Ingress配置。

    1. 執行以下命令編輯Ingress。

      kubectl edit ingress https-ingress
    2. 添加tls欄位,填入認證關聯的網域名稱。

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: https-ingress
        namespace: default
      spec:
        ingressClassName: alb
        rules:
        - host: demo.alb.ingress.top
          http:
            #...
        tls:
        - hosts:
          - demo.alb.ingress.top # 需要和“rules: host“欄位中的網域名稱保持一致,同時是認證關聯的網域名稱

使用Secret認證

您可以將認證儲存在叢集的Secret資源中,並在Ingress中使用。

  1. 執行以下命令,使用Base64對認證和私密金鑰編碼。

    echo -n `cat albtop-key.pem` | base64 # albtop-key.pem替換為私密金鑰檔案
    echo -n `cat albtop-cert.pem` | base64 # albtop-cert.pem替換為認證檔案
  2. 建立Secret。

    1. 建立https-secret.yaml,程式碼範例如下。

      apiVersion: v1
      kind: Secret
      metadata:
        name: https-secret
      type: kubernetes.io/tls
      data:
        tls.key: |
          {base64 albtop-key.pem} # Base64編碼後的albtop-cert.pem。
        tls.crt: |
          {base64 albtop-cert.pem}  # Base64編碼後的albtop-key.pem。
    2. 執行以下命令,建立Secret。

      kubectl apply -f https-secret.yaml
  3. 更新Ingress配置。

    1. 執行以下命令編輯Ingress。

      kubectl edit ingress https-ingress
    2. 添加tls欄位,填入認證關聯的網域名稱,以及secret資源的名稱。

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: https-ingress
        namespace: default
      spec:
        ingressClassName: alb
        rules:
        - host: demo.alb.ingress.top
          http:
            #...
        tls:
        - hosts:
          - demo.alb.ingress.top # 需要和“rules: host“欄位中的網域名稱保持一致,同時是認證關聯的網域名稱
          secretName: https-secret

使用ALBConfig指定認證

在將認證上傳到阿里雲數位憑證中心後,您可以在ALBConfig中的監聽的CertificateId欄位填入認證的ID,為監聽關聯已上傳的認證。

說明

如果監聽配置了認證,那麼此監聽下的Ingress不會再使用自動探索認證。

  1. 上傳自我簽署憑證至阿里雲數位憑證中心。具體操作,請參見上傳和共用SSL認證

  2. 擷取認證ID。

    1. 登入數位憑證管理服務控制台

    2. 在左側導覽列,選擇認證管理 > SSL認證管理

    3. SSL認證頁面,單擊上傳認證頁簽,在目標認證操作列下選擇表徵圖 > 詳情

      認證詳情面板中擷取CertIdentifier

  3. 關聯認證至ALBConfig。

    1. 執行以下命令編輯AlbConfig。

      kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME>替換AlbConfig的名稱
    2. 在監聽中添加certificates欄位,填入之前步驟中擷取的CertIdentifier

      apiVersion: alibabacloud.com/v1
      kind: AlbConfig
      metadata:
        name: alb
      spec:
        config: #...
        listeners:
          - port: 443
            protocol: HTTPS
            certificates:
            - CertificateId: 756****-cn-hangzhou # 認證的CertIdentifier
              IsDefault: true # 是否為預設認證
          - port: #...
            protocol: #...

步驟四:效果驗證

通過使用HTTPS協議訪問服務,可以驗證配置認證的效果。

  1. 執行以下命令,查看Ingress資訊。

    kubectl get ingress

    預期輸出:

    NAME            CLASS                HOSTS                  ADDRESS                         PORTS     AGE
    https-ingress   https-ingressclass   demo.alb.ingress.top   alb-********.alb.aliyuncs.com   80, 443   83m

    記錄下HOSTSADDRESS部分的值,以便後續步驟使用。

  2. 執行以下命令,使用HTTPS協議串連ALB Ingress訪問後端服務。其中的demo.alb.ingress.topalb-********.alb.aliyuncs.com請替換為在上一步中得到的值。

    curl -H HOST:demo.alb.ingress.top -k https://alb-********.alb.aliyuncs.com

    預期輸出如下,則表明認證配置成功:

    old

相關文檔