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

Container Service for Kubernetes:HTTPS 証明書の構成

最終更新日:Jan 24, 2025

HTTPS証明書を設定した後、Microservices Engine (MSE) IngressゲートウェイにデプロイされたサービスにTransport Layer Security (TLS) またはSecure Socket Layer (SSL) 暗号化を実装できます。 これは、最新のwebアプリケーションとAPIサービスのデータセキュリティを保護するために実行できる重要な対策の1つです。 HTTPS証明書を使用して、ゲートウェイを介したクライアントとサーバー間のデータ伝送を暗号化できます。 これにより、権限のない第三者が機密情報を盗んだり改ざんしたりするのを防ぎ、中間者攻撃から保護します。

前提条件

設定方法

MSE Ingressゲートウェイを使用すると、Kubernetes Secretを使用するか、MSEコンソールでHTTPS証明書を設定できます。

項目

Kubernetesシークレット

MSEコンソール

シナリオ

  • 証明書は、アノテーション設定に基づいて管理されます。

  • 証明書は、CI/CDパイプラインまたはcert-managerツールを使用して自動的に管理されます。

  • 証明書は、Alibaba Cloud Certificate Management Serviceコンソールで管理されます。

  • 証明書は、Web Application Firewall (WAF) やServer Load Balancer (SLB) などの複数のAlibaba Cloudサービスに適用されます。

  • 複数の証明書が同時にデプロイまたは置き換えられます。

優先度

低い。

高い。

クロス名前空間のサポート

サポートされていません。

サポートされています。

証明書の更新

Kubernetes Secretのコンテンツを置き換えます。

MSEコンソールで証明書を置き換えるか、Alibaba Cloud certificate Management Serviceコンソールで既存の証明書を置き換えるために新しい証明書をデプロイします。

バックエンドサービスのデプロイ

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[ワークロード] > [デプロイ] を選択します。

  3. [デプロイメント] ページで、[YAMLから作成] をクリックします。 次のYAMLコードを使用して、httpbinという名前のデプロイとhttpbinという名前のサービスをデプロイします。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
      template:
        metadata:
          labels:
            app: httpbin
            version: v1
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/mse-ingress/go-httpbin
              args:
                - "--version=v1"
              imagePullPolicy: Always
              name: httpbin
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      namespace: default
    spec:
      ports:
        - port: 8080
          protocol: TCP
      selector:
        app: httpbin

HTTPS証明書の設定

Kubernetes Secretを使用したHTTPS証明書の設定

ネイティブのIngressセマンティクスを使用してKubernetes Secretを参照することで、ドメイン名のHTTPS証明書を設定できます。

  1. ドメイン名証明書を準備します。 この例では、自己署名証明書が用意される。

    説明

    運用シナリオでは、サンプルキーと証明書を実際のキーと証明書に置き換える必要があります。 Alibaba Cloud certificate Management Serviceコンソールからドメイン名のキーと証明書をダウンロードできます。

    1. 次のコマンドを実行して、tls.crtという証明書ファイルとtls.keyという秘密鍵ファイルを生成します。

      openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=foo.bar.com/O=foo.bar.com"
    2. TLS証明書を格納するシークレットを作成します。

      1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

      2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[設定] > [秘密] を選択します。

      3. [作成] をクリックします。 [作成] パネルで、[名前] をtls-testに設定し、[タイプ][TLS証明書] に設定し、tls.crtファイルとtls.keyファイルを関連するフィールドにコピーして、[OK] をクリックします。

      image.png

  2. MSE Ingressルールを作成し、ドメインnam e foo.bar.comのHTTPS証明書を設定します。

    1. 左側のナビゲーションウィンドウで、[ネットワーク] > [Ingress] を選択します。

    2. [Ingress] ページで、[Ingressの作成] をクリックします。

    3. [Ingressの作成] ダイアログボックスで、[ゲートウェイの種類][MSE Cloud-native Gateway] を選択し、バックエンドサービスに関連付けられたサービスアノテーション証明書などの情報を指定して、[OK] をクリックします。

      Ingressクラスmseに設定します。 追加するルールで、[ルール] ドロップダウンリストから [プレフィックス (プレフィックスベースの一致)] を選択し、[パス] フィールドに /を入力し、[サービス] ドロップダウンリストから [httpbin] を選択し、Kubernetesシークレットを参照してドメイン名証明書を設定します。

      16621a99be546fbf7a3f98d7013cfeda

  3. HTTPSトラフィックをテストします。 次のコマンドを実行して、トラフィックをテストします。 x.x.x.xをゲートウェイの実際のIPアドレスに置き換えます。 ゲートウェイIPアドレスは、Ingressページで確認できます。

    説明

    この例では、自己署名証明書が使用され、ドメイン名はDNSサービスプロバイダーにファイルされていません。 この場合、-- resolveを使用してドメイン名をゲートウェイのIPアドレスに手動で解決し、-kを使用して証明書の有効性チェックをスキップする必要があります。

    curl -v -k https://foo.bar.com/version --resolve "foo.bar.com:443:x.x.x.x"

    期待される出力:

    * Connected to foo.bar.com (X.X.X.X) port 443 (#0)
    * ALPN, offering h2
    * ALPN, offering http/1.1
    * successfully set certificate verify locations:
    *   CAfile: /etc/ssl/cert.pem
      CApath: none
    * TLSv1.2 (OUT), TLS handshake, Client hello (1):
    * TLSv1.2 (IN), TLS handshake, Server hello (2):
    * TLSv1.2 (IN), TLS handshake, Certificate (11):
    * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
    * TLSv1.2 (IN), TLS handshake, Server finished (14):
    * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
    * TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
    * TLSv1.2 (OUT), TLS handshake, Finished (20):
    * TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
    * TLSv1.2 (IN), TLS handshake, Finished (20):
    * SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
    * ALPN, server accepted to use http/1.1
    * Server certificate:
    *  subject: CN=foo.bar.com; O=foo.bar.com
    *  start date: Jan 17 06:47:23 2024 GMT
    *  expire date: Jan 16 06:47:23 2025 GMT
    *  issuer: CN=foo.bar.com; O=foo.bar.com
    *  SSL certificate verify result: self signed certificate (18), continuing anyway.
    > GET /version HTTP/1.1
    > Host: foo.bar.com
    > User-Agent: curl/7.64.1
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    < date: Wed, 17 Jan 2024 07:49:39 GMT
    < content-length: 53
    < content-type: text/plain; charset=utf-8
    < req-cost-time: 3
    < req-arrive-time: 1705477779046
    < resp-start-time: 1705477779049
    < x-envoy-upstream-service-time: 2
    < server: istio-envoy
    <
    version: v1
    hostname: httpbin-xxxxxx

MSEコンソールでのHTTPS証明書の設定

MSEコンソールでドメイン名の証明書を設定できます。 この方法では、IngressでKubernetes Secretを参照する必要はありません。 ルーティングルールを設定するだけです。

重要

同じドメイン名の場合、MSEコンソールを使用する方法は、Kubernetes Secretを使用する方法よりも優先されます。 MSEコンソールとKubernetes Ingressの両方で同じドメイン名の証明書を設定する場合、MSEコンソールで設定された証明書が優先されます。

  1. ドメイン名証明書を準備します。 この例では、自己署名証明書が用意される。

    説明

    運用シナリオでは、サンプルキーと証明書を実際のキーと証明書に置き換える必要があります。 Alibaba Cloud certificate Management Serviceコンソールからドメイン名のキーと証明書をダウンロードできます。

    1. 次のコマンドを実行して、tls.crtという証明書ファイルとtls.keyという秘密鍵ファイルを生成します。

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=foo.bar.com/O=foo.bar.com"
    1. 自己署名証明書をAlibaba Cloud certificate Management Serviceコンソールにアップロードします。 詳細については、「SSL証明書のアップロードと共有」をご参照ください。 証明書がAlibaba Cloud certificate Management Serviceコンソールで管理されている場合は、次の手順に進みます。

  2. ドメイン名を作成し、証明書を設定します。

    1. MSEコンソールにログインします。 上部のナビゲーションバーで、リージョンを選択します。

    2. 左側のナビゲーションウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。 [ゲートウェイ] ページで、ゲートウェイの名前をクリックします。

    3. 左側のナビゲーションウィンドウで、Domain Names をクリックします。

    4. [ドメイン名の追加] をクリックします。 [ドメイン名の追加] パネルの [ドメイン名] フィールドにr foo.bar.comを表示し、[プロトコル] ドロップダウンリストからHTTPSを選択し、[証明書] ドロップダウンリストから証明書を選択します。

      image.png

  3. MSE Ingressを作成します。

    1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

    2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[ネットワーク] > [Ingress] を選択します。

    3. [Ingress] ページで、[Ingressの作成] をクリックします。

    4. [Ingressの作成] ダイアログボックスで、[ゲートウェイタイプ][MSE Ingress] を選択し、サービス名[アノテーション] など、バックアップされたサービスに関連するパラメーターを指定し、[OK] をクリックします。

      Ingressクラスmseに設定します。 追加するルールで、[ルール] ドロップダウンリストから [プレフィックス (プレフィックスベースの一致)] を選択し、[パス] フィールドに /と入力し、[サービス] ドロップダウンリストから [httpbin] を選択します。

      説明

      TLS証明書を設定する必要はありません。

      image.png

  4. HTTPSトラフィックをテストします。 次のコマンドを実行して、トラフィックをテストします。 x.x.x.xをゲートウェイの実際のIPアドレスに置き換えます。 ゲートウェイIPアドレスは、Ingressページで確認できます。

    説明

    この例では、自己署名証明書が使用され、ドメイン名はDNSサービスプロバイダーにファイルされていません。 この場合、-- resolveを使用してドメイン名をゲートウェイのIPアドレスに手動で解決し、-kを使用して証明書の有効性チェックをスキップする必要があります。

    curl -v -k https://foo.bar.com/version --resolve "foo.bar.com:443:x.x.x.x"

    期待される出力:

    * Connected to foo.bar.com (X.X.X.X) port 443 (#0)
    * ALPN, offering h2
    * ALPN, offering http/1.1
    * successfully set certificate verify locations:
    *   CAfile: /etc/ssl/cert.pem
      CApath: none
    * TLSv1.2 (OUT), TLS handshake, Client hello (1):
    * TLSv1.2 (IN), TLS handshake, Server hello (2):
    * TLSv1.2 (IN), TLS handshake, Certificate (11):
    * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
    * TLSv1.2 (IN), TLS handshake, Server finished (14):
    * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
    * TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
    * TLSv1.2 (OUT), TLS handshake, Finished (20):
    * TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
    * TLSv1.2 (IN), TLS handshake, Finished (20):
    * SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
    * ALPN, server accepted to use http/1.1
    * Server certificate:
    *  subject: CN=foo.bar.com; O=foo.bar.com
    *  start date: Jan 17 06:47:23 2024 GMT
    *  expire date: Jan 16 06:47:23 2025 GMT
    *  issuer: CN=foo.bar.com; O=foo.bar.com
    *  SSL certificate verify result: self signed certificate (18), continuing anyway.
    > GET /version HTTP/1.1
    > Host: foo.bar.com
    > User-Agent: curl/7.64.1
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    < date: Wed, 17 Jan 2024 08:16:27 GMT
    < content-length: 46
    < content-type: text/plain; charset=utf-8
    < req-cost-time: 5
    < req-arrive-time: 1705479387567
    < resp-start-time: 1705479387573
    < x-envoy-upstream-service-time: 4
    < server: istio-envoy
    <
    version: v1
    hostname: httpbin-xxxxxx