HTTPS証明書を設定した後、Microservices Engine (MSE) IngressゲートウェイにデプロイされたサービスにTransport Layer Security (TLS) またはSecure Socket Layer (SSL) 暗号化を実装できます。 これは、最新のwebアプリケーションとAPIサービスのデータセキュリティを保護するために実行できる重要な対策の1つです。 HTTPS証明書を使用して、ゲートウェイを介したクライアントとサーバー間のデータ伝送を暗号化できます。 これにより、権限のない第三者が機密情報を盗んだり改ざんしたりするのを防ぎ、中間者攻撃から保護します。
前提条件
サービスはMSE Ingressゲートウェイを使用して公開されます。 詳細については、「」、「MSE Ingressを使用してACKクラスターのアプリケーションにアクセスする」、および「MSE Ingressを使用してACKサーバーレスクラスターのアプリケーションにアクセスする」をご参照ください。
信頼できるデジタル証明書が利用可能です。 次のいずれかの方法を使用して、信頼できるデジタル証明書を取得できます。
証明書管理サービスコンソールで証明書を購入します。 詳細については、「SSL証明書の購入」をご参照ください。
他のCA当局から証明書を購入します。
オンプレミスのマシンで自己署名証明書を生成します。
設定方法
MSE Ingressゲートウェイを使用すると、Kubernetes Secretを使用するか、MSEコンソールでHTTPS証明書を設定できます。
項目 | Kubernetesシークレット | MSEコンソール |
シナリオ |
|
|
優先度 | 低い。 | 高い。 |
クロス名前空間のサポート | サポートされていません。 | サポートされています。 |
証明書の更新 | Kubernetes Secretのコンテンツを置き換えます。 | MSEコンソールで証明書を置き換えるか、Alibaba Cloud certificate Management Serviceコンソールで既存の証明書を置き換えるために新しい証明書をデプロイします。 |
バックエンドサービスのデプロイ
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
[デプロイメント] ページで、[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証明書を設定できます。
ドメイン名証明書を準備します。 この例では、自己署名証明書が用意される。
説明運用シナリオでは、サンプルキーと証明書を実際のキーと証明書に置き換える必要があります。 Alibaba Cloud certificate Management Serviceコンソールからドメイン名のキーと証明書をダウンロードできます。
次のコマンドを実行して、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"TLS証明書を格納するシークレットを作成します。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
[作成] をクリックします。 [作成] パネルで、[名前] をtls-testに設定し、[タイプ] を [TLS証明書] に設定し、tls.crtファイルとtls.keyファイルを関連するフィールドにコピーして、[OK] をクリックします。

MSE Ingressルールを作成し、ドメインnam e foo.bar.comのHTTPS証明書を設定します。
左側のナビゲーションウィンドウで、[ネットワーク] > [Ingress] を選択します。
[Ingress] ページで、[Ingressの作成] をクリックします。
[Ingressの作成] ダイアログボックスで、[ゲートウェイの種類] の [MSE Cloud-native Gateway] を選択し、バックエンドサービスに関連付けられたサービス、アノテーション、証明書などの情報を指定して、[OK] をクリックします。
Ingressクラスをmseに設定します。 追加するルールで、[ルール] ドロップダウンリストから [プレフィックス (プレフィックスベースの一致)] を選択し、[パス] フィールドに
/を入力し、[サービス] ドロップダウンリストから [httpbin] を選択し、Kubernetesシークレットを参照してドメイン名証明書を設定します。
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コンソールで設定された証明書が優先されます。
ドメイン名証明書を準備します。 この例では、自己署名証明書が用意される。
説明運用シナリオでは、サンプルキーと証明書を実際のキーと証明書に置き換える必要があります。 Alibaba Cloud certificate Management Serviceコンソールからドメイン名のキーと証明書をダウンロードできます。
次のコマンドを実行して、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"自己署名証明書をAlibaba Cloud certificate Management Serviceコンソールにアップロードします。 詳細については、「SSL証明書のアップロードと共有」をご参照ください。 証明書がAlibaba Cloud certificate Management Serviceコンソールで管理されている場合は、次の手順に進みます。
ドメイン名を作成し、証明書を設定します。
MSEコンソールにログインします。 上部のナビゲーションバーで、リージョンを選択します。
左側のナビゲーションウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。 [ゲートウェイ] ページで、ゲートウェイの名前をクリックします。
左側のナビゲーションウィンドウで、Domain Names をクリックします。
[ドメイン名の追加] をクリックします。 [ドメイン名の追加] パネルの [ドメイン名] フィールドにr foo.bar.comを表示し、[プロトコル] ドロップダウンリストからHTTPSを選択し、[証明書] ドロップダウンリストから証明書を選択します。

MSE Ingressを作成します。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
[Ingress] ページで、[Ingressの作成] をクリックします。
[Ingressの作成] ダイアログボックスで、[ゲートウェイタイプ] の [MSE Ingress] を選択し、サービス名や [アノテーション] など、バックアップされたサービスに関連するパラメーターを指定し、[OK] をクリックします。
Ingressクラスをmseに設定します。 追加するルールで、[ルール] ドロップダウンリストから [プレフィックス (プレフィックスベースの一致)] を選択し、[パス] フィールドに
/と入力し、[サービス] ドロップダウンリストから [httpbin] を選択します。説明TLS証明書を設定する必要はありません。

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