HTTPS 証明書を設定することで、MSE Ingress ゲートウェイにデプロイされたサービスに対してトランスポート層セキュリティ (TLS) / セキュアソケットレイヤー (SSL) 暗号化を有効にできます。これは、最新の Web アプリケーションおよび API サービスのデータを保護するための重要なステップです。HTTPS 証明書により、クライアントとゲートウェイ間で送信されるデータが暗号化され、権限のない第三者による機密情報の窃取や改ざんを防ぎます。また、中間者攻撃に対する強力な防御も提供します。
前提条件
-
MSE Ingress ゲートウェイを介してサービスを公開済みであること。詳細については、「MSE Ingress ゲートウェイを介した Container Service for Kubernetes (ACK) のサービスへのアクセス」または「MSE Ingress ゲートウェイを介した ACK Serverless のサービスへのアクセス」をご参照ください。
-
信頼できるデジタル証明書を保有していること。次のいずれかの方法で取得できます。
-
Alibaba Cloud Certificate Management Service から証明書を購入します。詳細については、「SSL 証明書の購入」をご参照ください。
-
他の認証局 (CA) から購入した証明書を使用します。
-
ローカルで自己署名証明書を生成します。
-
設定方法
MSE Ingress ゲートウェイでは、HTTPS 証明書を設定する方法として、Kubernetes Secret を使用する方法と MSE コンソールを使用する方法の 2 つを利用できます。
|
項目 |
Kubernetes Secret |
MSE コンソール |
|
ユースケース |
|
|
|
優先度 |
低 |
高 |
|
クロス名前空間 |
サポートされていません。 |
サポートされています。 |
|
証明書の更新 |
Kubernetes Secret の内容を置換します。 |
MSE コンソールで証明書を置換するか、Certificate Management Service コンソールで新しい証明書をデプロイします。 |
バックエンドサービスのデプロイ
-
コンテナサービス for Kubernetes (ACK) コンソールにログインします。左側のナビゲーションペインで、クラスターリストをクリックします。
-
クラスターリスト ページで、目的のクラスターの名前をクリックします。 左側のナビゲーションペインで、 を選択します。
-
**[Deployments]** ページで **[Create from YAML]** をクリックします。次の YAML を使用して httpbin Deployment と httpbin Service をデプロイします。
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
ネイティブ Ingress セマンティクスを使用して Kubernetes Secret を参照することで、ドメインに HTTPS 証明書を設定できます。
-
ドメイン証明書を準備します。この例では自己署名証明書を使用します。
説明本番環境では、ご自身のビジネス用の実際の秘密鍵と証明書を使用する必要があります。ドメインのキーと証明書は、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 証明書を保存するための Secret を作成します。
-
コンテナサービス for Kubernetes (ACK) コンソールにログインします。左側のナビゲーションペインで、クラスターリスト をクリックします。
-
クラスターリスト ページで、目的のクラスターの名前をクリックします。左側のナビゲーションペインで、 を選択します。
-
作成 をクリックし、表示される 作成 パネルで 名前 を tls-test に設定し、Type として TLS 証明書 を選択し、作成された tls.crt および tls.key の内容を対応する入力ボックスにコピーしてから、作成 をクリックします。
-
-
-
MSE Ingress を作成し、ドメイン
foo.bar.comに HTTPS 証明書を設定します。-
左側メニューで、**[Network]** > **[Ingresses]** を選択します。
-
**[Ingresses]** ページで **[Create Ingress]** をクリックします。**[Create Ingress]** ダイアログボックスで、ルートを設定します。
パラメータ
説明
例
Gateway type
[MSE Ingress] を選択します。異なるゲートウェイタイプの比較については、「Nginx Ingress、ALB Ingress、APIG Ingress、および MSE Ingress の比較」をご参照ください。
MSE Ingress
[名前]
Ingress のカスタム名を入力します。
test
IngressClass
関連するリソースクラスを選択します。
mse
Rule
[+ Add Rule] をクリックして、ルーティングルールを追加します。
-
[Domain name]:カスタムドメイン名。
-
[Path mapping]:次のパラメータを設定します。
-
[Path]:サービスにアクセスするための URL パス。
-
[Match rule]:
-
[Prefix (prefix-based match)]:リクエスト URL パスのプレフィックスと一致します。
-
[Exact (exact match)]:リクエスト URL パスと完全に一致します。
-
[Default (implementation-specific)]:動作は Ingress コントローラーの具体的なロジックによって決定されます。
詳細については、「ALB Ingress の高度な機能」をご参照ください。
-
-
[Service]:ターゲットの Kubernetes Service。
-
[Port]:サービスに公開するポート。
-
-
[+ Add Path] をクリックして、さらにパスを追加します。
-
[Domain name]:foo.bar.com
-
[Path mapping]:
-
[Path]:/
-
[Match rule]:Prefix (prefix-based match)
-
[Service]:httpbin
-
[Port]:8080
-
[TLS configuration]
TLS を有効にして、セキュアなルーティングサービスを設定します。
-
[Domain name]:カスタムドメイン名。
-
[Secret]:適切な Secret を選択します。
注記
空のままにすると、証明書の自動検出が有効になります。
新しい Secret を作成するには、次の手順を実行します。
-
[Secret] フィールドの右側にある [Create] をクリックします。
-
[シークレットの作成] ダイアログボックスで、シークレットの 名前、[証明書]、[キー] を指定し、OK をクリックします。
-
[Secret] ドロップダウンリストから、作成した Secret を選択します。
-
[+ Add TLS Configuration] をクリックして、複数の TLS 設定を構成します。
-
[Domain name]:foo.bar.com
-
[Secret]:tls-test
-
-
その他の設定はデフォルト値のままにし、**[Create Ingress]** ページで **[OK]** をクリックします。
-
-
HTTPS トラフィックをテストします。次のコマンドを実行します。
x.x.x.xを実際のゲートウェイ IP アドレスに置き換えてください。ゲートウェイ IP アドレスは、Ingresses リストページで確認できます。説明この例では、自己署名証明書と、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 コンソール
MSE コンソールで直接ドメインの証明書を設定できます。この方法では、Ingress オブジェクトで Kubernetes Secret を参照する必要はなく、ルーティングルールを設定するだけです。
同じドメイン名の場合、MSE コンソールの方法が Kubernetes Secret の方法よりも優先されます。MSE コンソールと Kubernetes Ingress リソースの両方で同じドメインの証明書を設定した場合、コンソールからの証明書が使用されます。
-
ドメイン証明書を準備し、Alibaba Cloud Certificate Management Service にアップロードします。詳細については、「SSL 証明書のアップロード、同期、および共有」をご参照ください。証明書が既に Certificate Management Service で管理されている場合は、このステップをスキップできます。
-
ドメインを作成し、その証明書を設定します。
-
MSE Gateway Management コンソールにログインし、上部メニューでリージョンを選択します。
-
左側のナビゲーションペインで、Cloud-Native Gateway > ゲートウェイリスト を選択し、対象のゲートウェイインスタンスの ID をクリックします。
-
左側のナビゲーションペインで、Routesをクリックし、[ドメイン] タブを選択します。
-
[ドメイン名の追加] をクリックします。[ドメイン名] を追加し、Protocol を HTTPS に設定して、対応する証明書を選択します。
-
-
サービスを作成します。
-
MSE インスタンスのルート管理ページで、Service タブを選択し、[サービスの作成] をクリックします。
-
Service Sources を コンテナサービス に設定し、適切な Namespaces を選択して、[サービスリスト] で先ほど作成した
httpbinサービスにチェックを入れ、OK をクリックします。
-
-
ルートを作成します。
-
MSE インスタンスの Route Management ページで、**[Route]** タブを選択し、**[Create route]** をクリックします。
-
[Domain name] には、ステップ 2 で追加したドメインを選択します。[Backend service] には、ステップ 3 で作成したサービスを選択し、[Save and publish] をクリックします。
-
-
HTTPS トラフィックをテストします。次のコマンドを実行します。
x.x.x.xを実際のゲートウェイ IP アドレスに置き換えてください。ゲートウェイ IP アドレスは、確認できます。説明自己署名証明書を使用していて、ドメインが DNS プロバイダーに登録されていない場合は、
--resolveフラグを使用してドメイン名を手動でゲートウェイ IP アドレスに解決し、-kフラグを使用して証明書の検証をスキップする必要があります。<Your-DomainName>を実際のドメイン名に置き換えてください。curl -v -k https://<Your-DomainName>/version --resolve "<Your-DomainName>:443:x.x.x.x"期待される出力は次のとおりです。
* Connected to ********** (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=*********; O=********** * start date: Jan 17 06:47:23 2024 GMT * expire date: Jan 16 06:47:23 2025 GMT * issuer: CN=**********; O=********** * SSL certificate verify result: self signed certificate (18), continuing anyway. > GET /version HTTP/1.1 > Host: ********** > 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