標準的な HTTPS ではサーバーのみが検証され、任意のクライアントが接続可能です。相互 TLS(mTLS)では、サーバーとクライアントの双方が有効な証明書を提示する必要があります。このため、信頼する CA によって署名された証明書を持つクライアントのみが接続を確立できます。Application Load Balancer (ALB) のリスナーで mTLS を強制することで、不正な接続はバックエンドに到達する前に拒否されます。
本設定は、金融、IoT、企業内サービス、および個人情報を取り扱う公共セクター向けアプリケーションに適しています。
仕組み
| 認証方式 | クライアントによるサーバー検証 | サーバーによるクライアント検証 |
|---|---|---|
| 片方向(標準 HTTPS) | はい | なし |
| 相互(mTLS) | はい | はい |
相互認証では、サーバーが CA 証明書を保持し、クライアントがその CA によって署名された SSL または TLS 証明書を保持します。ALB は、すべての接続においてクライアント証明書を CA 証明書に対して検証します。両者が互いの ID を検証した後にのみ、セキュアチャネルが確立されます。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
ALB リスナーに SSL または TLS 証明書が設定されていること。詳細については、「暗号化通信のための HTTPS 証明書の設定」をご参照ください。
ルート CA 証明書を以下いずれかの方法で取得済みであること:
Certificate Management Service コンソールからプライベート CA を購入すること — 詳細については、「プライベート CA の購入と有効化」をご参照ください。
本トピックの手順 1 に従って自己署名ルート CA 証明書を生成すること
(オプション)手順 1:自己署名ルート CA 証明書の生成
ローカル環境でルート CA 証明書を生成し、Certificate Management Service コンソールにアップロードします。
証明書の生成
秘密鍵を作成します。
openssl genrsa -out ca.key 4096証明書署名要求(CSR)を作成します。
フィールド 説明 必須 Country Name 2 文字の国別コード(例:中国の場合は cn)はい State or Province Name 州または都道府県の正式名称 はい Locality Name 市区町村名 はい Organization Name 会社または組織名 はい Organizational Unit Name 部署またはユニット名 はい Common Name 証明書のドメイン名 いいえ Email Address 証明書管理者の連絡先メールアドレス いいえ A challenge password CSR アクセスの認証に使用するパスワード。不要な場合は空欄のままにしてください。 いいえ An optional company name 不要な場合は空欄のままにしてください。 いいえ openssl req -new -out ca.csr -key ca.keyプロンプトが表示されたら、以下のフィールドに値を入力します。
Country Name (2 letter code) [XX]:cn State or Province Name (full name) []:bj Locality Name (eg, city) [Default City]:bj Organization Name (eg, company) [Default Company Ltd]:alibaba Organizational Unit Name (eg, section) []:test Common Name (eg, your name or your servers hostname) []:root Email Address []:a.alibaba.com A challenge password []: An optional company name []:ルート CA 証明書を作成します。
ca.crt— ルート CA 証明書(手順 3 で AlbConfig の設定に使用)ca.csr— CA に送付する CSRca.key— 秘密鍵(手順 2 でクライアント証明書の署名に使用)
重要ca.keyは機密情報を含むため、厳重に管理してください。秘密鍵にアクセス可能な者は、信頼されたクライアント証明書を発行できます。openssl x509 -req -in ca.csr -out ca.crt -signkey ca.key -CAcreateserial -days 3650lsコマンドを実行して、以下のファイルが存在することを確認します。ca.crt ca.csr ca.key
CA 証明書のアップロード
Certificate Management Service コンソールにログインします。左側ナビゲーションウィンドウで、証明書申請リポジトリ をクリックします。
リポジトリの作成 をクリックします。表示されるパネルで、以下のパラメーターを設定し、OK をクリックします。
パラメーター 説明 リポジトリ名 任意の名前を入力します データソース アップロード済み証明書 をクリックし、第三者の証明書サービスプロバイダーから購入・発行されたプライベート証明書を選択します 作成したリポジトリをクリックします。証明書の管理 ページで、アップロード済み証明書 をクリックします。
CA 情報 パネルで、以下のパラメーターを設定し、確認して有効化 をクリックします。
パラメーター 説明 パッケージ名 証明書の任意の名前を入力します CA 証明書 ca.crtの PEM エンコード形式の内容を貼り付けます。または、アップロード をクリックしてファイルを選択します証明書キー ca.key
手順 2:クライアント証明書の生成
手順 1 で生成した自己署名 CA 証明書を使用して、クライアント証明書を発行します。この証明書は、クライアントが ALB リスナーと認証を行う際に提示されます。
クライアント証明書用の秘密鍵を生成します。
openssl genrsa -out client.key 4096クライアント証明書用の CSR を生成します。
openssl req -new -out client.csr -key client.key手順 1 のルート CA でクライアント証明書に署名します。
openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650lsコマンドを実行して、以下のファイルが存在することを確認します。client.crt client.csr client.key
手順 3:AlbConfig を使用した相互認証の有効化
AlbConfig リソースは、ALB インスタンスおよびそのリスナーを定義します。caEnabled: true をリスナーに設定すると、mTLS が有効化されます。これにより、ALB はそのリスナーへのすべての HTTPS 接続において、クライアント証明書の提示および検証を要求します。
Certificate Management Service コンソールから、以下の 2 つの証明書 ID を取得する必要があります。
サーバー証明書 ID — SSL 証明書 > アクションアイコン > 詳細 > 証明書の詳細 パネルへ移動します
ルート CA 証明書 ID — 証明書申請リポジトリ > ご自身のリポジトリ > 証明書の管理 > 詳細 > 証明書の詳細 パネルへ移動します
以下の構造で AlbConfig を適用します。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb-demo
spec:
config:
name: alb-test
addressType: Intranet
# 少なくとも 2 つの異なるゾーンの vSwitch を指定します。
# これらのゾーンは ALB でサポートされており、クラスターと同じ VPC に属している必要があります。
zoneMappings:
- vSwitchId: vsw-2zednnurkug2xl4******
- vSwitchId: vsw-2zeusdspvojoumx******
listeners:
- port: 443
protocol: HTTPS
caEnabled: true # 相互認証を有効化
caCertificates:
- CertificateId: 0e40dda998174723af39d37fcaf***** # ルート CA 証明書 ID
certificates:
- CertificateId: 108*****-cn-hangzhou # サーバー証明書 ID
IsDefault: true手順 4:相互認証のテスト
テストサービスをデプロイし、ALB がクライアント証明書の検証を強制していることを確認します。
以下の内容で
coffee.yamlというファイルを作成します。apiVersion: apps/v1 kind: Deployment metadata: name: coffee spec: replicas: 2 selector: matchLabels: app: coffee template: metadata: labels: app: coffee spec: containers: - name: coffee image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: coffee-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: coffee type: NodePort --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/listen-ports: | [{"HTTPS": 443}] name: alb-ingress spec: ingressClassName: alb rules: - host: alb.ingress.alibaba.com # 実際のドメイン名に置き換えてください。 http: paths: - path: / pathType: Prefix backend: service: name: coffee-svc port: number: 80テストサービスをデプロイします。
kubectl apply -f coffee.yaml期待される出力:
deployment.apps/coffee created service/coffee-svc created ingress.networking.k8s.io/alb-ingress createdALB インスタンスの弾性 IP アドレス(EIP)を取得します。
ALB コンソール にログインし、ALB インスタンスがデプロイされているリージョンを選択します。
インスタンス ページで、ALB インスタンスをクリックします。
インスタンスの詳細ページの ゾーン セクションで、vSwitch に関連付けられた EIP を確認します。
ローカルの
hostsファイルに DNS レコードを追加し、ドメイン名を EIP にマップします。123.XX.XX.XX alb.ingress.alibaba.comクライアント証明書を使用してアクセスをテストします。
curl https://alb.ingress.alibaba.com/ --cert client.crt --key client.keyサーバーから応答が返され、HTML ページにリダイレクトされます。これは、ALB がクライアント証明書を受理したことを確認するものです。
次のステップ
ALB を使用中にエラーが発生した場合は、まず ALB のドキュメントを参照してください。詳細については、「ALB イングレスコントローラーのトラブルシューティング」および「ALB イングレスに関するよくある質問」をご参照ください。