すべてのプロダクト
Search
ドキュメントセンター

:HTTPS での暗号化通信用の証明書を構成する

最終更新日:Dec 26, 2024

HTTPS リスナーを構成する場合、クライアントとリスナー間の接続を暗号化するために、リスナーに SSL または TLS 証明書を関連付ける必要があります。このトピックでは、Application Load Balancer (ALB) Ingress を使用して HTTPS リスナーの証明書を構成する方法について説明します。

証明書の構成方法の比較

ALB Ingress では、証明書の自動検出の構成、Kubernetes Secret としての証明書の管理、AlbConfig での証明書の指定を行うことができます。次の表は、上記の方法を比較したものです。

項目

証明書の自動検出を構成する

AlbConfig で証明書を指定する

Secret として証明書を管理する

証明書の保存場所

証明書は Certificate Management Service に保存されます。

証明書は Kubernetes Secret として保存されます。

証明書の検出

証明書は、証明書にバインドされているドメイン名に基づいて検出されます。

証明書は、その ID に基づいて検出されます。

証明書は、証明書が保存されている Secret に基づいて検出されます。

シナリオ

この方法は、Certificate Management Service コンソールで購入した証明書、または Certificate Management Service コンソールにアップロードされた証明書に適しています。

この機能は、クラスターで管理されている証明書に適しています。たとえば、cert-manager を使用して証明書を管理する場合、証明書を Secret に保存できます。

名前空間をまたがる証明書の使用

サポートされています。

サポートされていません。Secret として保存された証明書は、Secret の名前空間内でのみ使用できます。

証明書の更新方法

新しい証明書をCertificate Management Service コンソールにアップロードするか、元の証明書を更新する必要があります。その後、証明書が関連付けられている Ingress の構成を手動で変更する必要があります。

証明書が保存されている Secret の構成を更新する必要があります。

重要

ALB インスタンスは最大 25 個の証明書をサポートします。ほとんどの場合、ALB インスタンスで使用される証明書の数は、Ingress に関連付けられた証明書を含む、インスタンスのすべてのリスナーに関連付けられた証明書の総数と同じです。詳細については、ALB クォータの計算方法を参照してください。

異なる方法で構成された証明書の互換性

次の表は、異なる証明書構成方法の互換性について説明しています。

証明書の構成方法

説明

証明書の自動検出を使用して 1 つの証明書が構成され、Kubernetes Secret を使用して別の証明書が構成されています。

  • 両方の証明書が同じドメイン名に関連付けられている場合、Secret を使用して構成された証明書が優先的に使用されます。

  • 証明書が異なるドメイン名に関連付けられている場合、ALB Ingress コントローラーは対応するドメイン名の証明書を使用します。

証明書の自動検出を使用して 1 つの証明書が構成され、AlbConfig で別の証明書が指定されています。両方の証明書が同じリスナーに関連付けられています。

リスナーは、AlbConfig で指定された証明書のみを使用します。

Kubernetes Secret を使用して 1 つの証明書が構成され、AlbConfig で別の証明書が指定されています。両方の証明書が同じリスナーに関連付けられています。

両方の証明書が使用されます。

前提条件

  • AlbConfig が作成されていること。詳細については、ALB Ingress を使い始めるを参照してください。

  • 信頼できる証明書を取得していること。証明書は次のいずれかの方法で取得できます。

    • Certificate Management Service コンソールで証明書を購入する。詳細については、SSL 証明書を購入するを参照してください。

    • 別の認証局 (CA) によって発行された証明書を購入する。

    • (オプション) 自己署名証明書を生成するの手順に従って、自己署名証明書を生成する。

(オプション) 手順 1: 自己署名証明書を生成する

次の OpenSSL コマンドを実行して、自己署名証明書を作成します。

重要

デフォルトでは、自己署名証明書はブラウザーまたはクライアントによって信頼されません。Ingress に自己署名証明書を関連付けると、Ingress を使用するアプリケーションにアクセスしたときにセキュリティ警告が表示される場合があります。この例で生成される自己署名証明書は参照用です。本番環境ではこの証明書を使用しないでください。

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 ドメイン名が自己署名証明書に関連付けられています。ドメイン名をカスタムドメイン名に置き換えることができます。

手順 2: 証明書を使用するためのリソースを作成する

作成した AlbConfig に加えて、ALB Ingress を正常に機能させるには、Deployment、Service、IngressClass、および Ingress を作成する必要があります。次の YAML テンプレートを使用して、上記のリソースを作成できます。

  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 フィールドを追加します。例:

    複数のリスナーを使用する場合はアノテーションを追加する

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: https-ingress
      annotations:
        alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]' # ALB Ingress が複数のリスナーに関連付けられている場合は、このアノテーションを追加します。
    spec:
      #...
  3. 次のコマンドを実行して、上記のリソースを作成します。

    kubectl apply -f https-quickstart.yaml

手順 3: 証明書を構成する

証明書の自動検出を構成する

自己署名証明書を Certificate Management Service にアップロードした後、Ingress 構成の tls フィールドにバインドされたドメイン名を指定できます。これにより、ALB Ingress はアップロードされた証明書を自動的に検出して使用できます。

  1. 自己署名証明書を Certificate Management Service コンソールにアップロードします。詳細については、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 構成で Secret を指定できます。

  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. albconfig.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。

      apiVersion: v1
      kind: Secret
      metadata:
        name: https-secret
      type: kubernetes.io/tls
      data:
        tls.key: |
          {base64 albtop-key.pem} # albtop-key.pem ファイルの Base64 エンコードされたコンテンツ。
        tls.crt: |
          {base64 albtop-cert.pem}  # albtop-cert.pem ファイルの Base64 エンコードされたコンテンツ。
    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 で証明書を指定する

自己署名証明書を Certificate Management Service にアップロードした後、AlbConfig のリスナー構成の CertificateId フィールドで証明書 ID を指定できます。これにより、証明書がリスナーに関連付けられます。

説明

リスナーが証明書に関連付けられている場合、Ingress は証明書の自動検出機能を使用しなくなります。

  1. 自己署名証明書を Certificate Management Service コンソールにアップロードします。詳細については、SSL 証明書をアップロードするを参照してください。

  2. 証明書 ID を取得します。

    1. Certificate Management Service コンソールにログインします。

    2. 左側のナビゲーションペインで、証明書管理 > SSL 証明書管理を選択します。

    3. SSL 証明書管理ページで、SSL証明書管理アップロードされた証明書の管理タブをクリックします。アップロードした証明書を選択し、图标 > 詳細アクション列でを選択します。

      証明書の詳細パネルで、CertIdentifier フィールドに証明書 ID が表示されます。

  3. AlbConfig で証明書 ID を指定します。

    1. 次のコマンドを実行して、AlbConfig を変更します。

      kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME> を AlbConfig の名前に置き換えます。
    2. AlbConfig のリスナー構成に certificates フィールドを追加し、前の手順で取得した証明書 IDを指定します。

      apiVersion: alibabacloud.com/v1
      kind: AlbConfig
      metadata:
        name: alb
      spec:
        config: #...
        listeners:
          - port: 443
            protocol: HTTPS
            certificates:
            - CertificateId: 756****-cn-hangzhou # 証明書 ID を指定します。
              IsDefault: true # 証明書がデフォルトの証明書かどうかを指定します。
          - port: #...
            protocol: #...

手順 4: 証明書が構成されていることを確認する

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

    HOSTS 列と ADDRESS 列の値を記録します。

  2. 次のコマンドを実行して、ALB Ingress のバックエンドサービスにアクセスします。demo.alb.ingress.topalb-********.alb.aliyuncs.com を前の手順で取得した値に置き換えます。

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

    次の出力が返された場合、証明書は構成されています。

    old

関連情報