HTTPS相互認証メカニズムは、サーバーとクライアントが互いの身元を確認できるようにします。 HTTPS相互認証を使用して、プライバシー保護を伴う金融、IoT、企業内部サービス、または公共サービス部門、またはサービスが特定のクライアントにのみ公開されるシナリオでサービスセキュリティを保証できます。
HTTPS一方向認証とHTTPS相互認証の比較
HTTPS一方向認証: クライアントはサーバーからSSLまたはTLS証明書をダウンロードしてサーバーのIDを確認し、安全なチャネルを確立します。 サーバーはクライアントのIDを検証できません。
HTTPS相互認証: クライアントはサーバーからSSLまたはTLS証明書をダウンロードして、サーバーのIDを確認します。 一方、クライアントは、そのIDの証明として、そのSSLまたはTLS証明書をサーバに送信する。 セキュア・チャネルは、クライアントとサーバが互いのアイデンティティを検証した後にのみ確立される。 ほとんどの場合、サーバーはルートCA証明書を保持し、クライアントはルートCA証明書に基づいて署名および発行されたSSLまたはTLS証明書を保持します。 したがって、サーバは、クライアントのアイデンティティを検証することができる。 HTTPS相互認証を使用すると、信頼できるクライアントにのみサービスを公開できます。これにより、man-in-the-middle攻撃を防ぎ、サービスのセキュリティを強化できます。
前提条件
SSLまたはTLS証明書は、「暗号化通信用のHTTPS証明書の設定」の手順に従って設定されます。
ルートCA証明書が取得されます。 ルートCA証明書は、次のいずれかの方法で取得できます。
証明書管理サービスコンソールで証明書を購入します。 詳細については、「プライベートCAの購入と有効化」をご参照ください。
(オプション) (オプション) Step 1: Generate a self-signed CA certificateの手順に従って、自己署名証明書を生成します。
(オプション) ステップ1: 自己署名CA証明書の生成
ルートCA証明書を生成するには、次の手順を実行します。
次のコマンドを実行して、秘密鍵を作成します。
openssl genrsa -out ca.key 4096
次のコマンドを実行して、証明書署名要求 (CSR) を作成します。
openssl req -new -out ca.csr -key ca.key
上記のコマンドを実行した後、証明書情報を指定します。 次のサンプルコードブロックは、パラメーターとサンプル値を示しています。
国名 (2文字コード) [XX]:cn 州または州名 (フルネーム) []:bj 地域名 (例、都市) [デフォルトの都市]:bj 組織名 (例えば、会社) [Default company Ltd]:alibaba 組織単位名 (例、セクション) []:test 共通名 (例: あなたの名前またはサーバーのホスト名) []:root メールアドレス []:a.alibaba.com チャレンジパスワード []:
下表に、各パラメーターを説明します。
パラメーター
必須/任意
説明
国名
必須
国コード。通常、cn (中国) などの2文字で構成されます。
州または省名
必須
州または自治区の名前。
ローカリティ名
必須
都市の名前。
組織名
必須
組織の名前 (会社名など) 。
組織単位名
必須
部門の名前。
共通名
任意
よく使われる名前。
電子メールアドレス
任意
証明書管理者への連絡に使用されるメールアドレス。
チャレンジパスワード
任意
CSRのセキュリティを強化するために使用されるパスワード。 この例では、パスワードは設定されていません。
次のコマンドを実行して、ルートCA証明書を作成します。
openssl x509 -req -in ca.csr -out ca.crt -signkey ca.key -CAcreateserial -days 3650
上記の操作を実行した後、
ls
コマンドを実行して、カレントディレクトリのルート証明書の秘密鍵ファイルと証明書ファイルを表示します。ca.crt ca.csr ca.key
ca.crt
はルートCA証明書ファイル、ca.csr
はCSRファイル、ca.key
は秘密鍵ファイルです。
ステップ2: 証明書のアップロード
証明書管理サービスコンソールにログインします。 左側のナビゲーションウィンドウで、[証明書アプリケーションリポジトリ] をクリックします。
[証明書アプリケーションリポジトリ] ページで、[リポジトリの作成] をクリックします。 [リポジトリの作成] パネルで、次のパラメーターを設定し、[OK] をクリックします。
パラメーター
説明
リポジトリ名
リポジトリの名前。 カスタム名を指定できます。
データソース
[Upload CA Certificates] を選択して、サードパーティの認証局によって署名および発行されたプライベート証明書をアップロードします。
[証明書アプリケーションリポジトリ] ページで、作成したリポジトリをクリックします。 [証明書の管理] ページで、[証明書のアップロード] をクリックします。
[CA情報] パネルで、次の表に基づいてパラメーターを設定し、手順3で作成したCA証明書をアップロードし、[確認して有効にする] をクリックします。
パラメーター
説明
パッケージ名
アップロードする証明書のカスタム名を入力します。
CA証明書
プライベート証明書ファイルの内容を入力するか、[アップロード] を選択して証明書ファイルをアップロードします。
証明書の右側にある [詳細] をクリックし、証明書識別子を記録します。
ステップ3: ルートCA証明書を使用してクライアント証明書を生成する
次のコマンドを実行して、クライアント証明書の秘密鍵を生成します。
openssl genrsa -out client.key 4096
次のコマンドを実行して、クライアント証明書を作成するためのCSRを生成します。
openssl req -new -out client.csr -key client.key
上記のコマンドを実行した後、証明書情報を指定します。 次のサンプルコードブロックは、パラメーターとサンプル値を示しています。
国名 (2文字コード) [XX]:cn 州または州名 (フルネーム) []:bj 地域名 (例、都市) [デフォルトの都市]:bj 組織名 (例えば、会社) [Default company Ltd]:alibaba 組織単位名 (例、セクション) []:test 共通名 (例: あなたの名前またはサーバーのホスト名) []:root メールアドレス []:a.alibaba.com チャレンジパスワード []:
下表に、各パラメーターを説明します。
パラメーター
必須/任意
説明
国名
必須
国コード。通常、cn (中国) などの2文字で構成されます。
州または省名
必須
州または自治区の名前。
ローカリティ名
必須
都市の名前。
組織名
必須
組織の名前 (会社名など) 。
組織単位名
必須
部門の名前。
共通名
任意
よく使われる名前。
電子メールアドレス
任意
証明書管理者への連絡に使用されるメールアドレス。
チャレンジパスワード
任意
CSRのセキュリティを強化するために使用されるパスワード。 この例では、パスワードは設定されていません。
次のコマンドを実行して、クライアント証明書を生成します。
openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA ca.crt -CAkey ca.key-CAreateserial-days 3650
ca.crt
とca.key
は、ルートCA証明書ファイルと秘密鍵ファイルです。上記の操作を実行した後、
ls
コマンドを実行して、現在のディレクトリに生成されたクライアント証明書を表示します。client.crt client.csr client.key
client.crt
はルートCA証明書に基づいて署名されたクライアント証明書ファイル、client.csr
はCSRファイル、client.key
はクライアント秘密鍵ファイルです。
ステップ4: 相互認証の有効化とテスト
HTTPSリスナーの相互認証を有効にします。
次のコマンドを実行して、AlbConfigを変更します。
kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME> をAlbConfigの名前に置き換えます。
caEnabled
フィールドをHTTPSリスナーに追加してtrue
に設定し、caCertificateId
フィールドをリスナーに追加して、ステップ2で取得したルートCA証明書の識別子に設定します。apiVersion: alibabacloud.com/v1 kind: AlbConfig メタデータ: name: #... spec: config: #... リスナー: - port: 443 protocol: HTTPS caEnabled: true# caEnabledフィールドを追加し、値をtrueに設定します。 caCertificates: -CertificateId: 0e40dda998174723af39d37fcaf *****# 手順2で取得したルートCA証明書の識別子を指定します。 証明書: #...
相互認証をテストします。
次のコマンドを実行して、Ingress情報を表示します。
kubectl get ingress
期待される出力:
NAME CLASS HOSTS ADDRESS PORTS AGE https-ingressclass https-ingressclass demo.alb.ingress.top alb-******* .alb.aliyuncs.com 80, 443 83m
HOSTS
およびADDRESS
の下の値をコピーして、後で使用します。次のコマンドを実行して、このトピックのクライアント証明書と秘密鍵を使用してサービスにアクセスします。
demo.alb.ingress.top
およびalb-******** .alb.aliyuncs.com
を前の手順で取得した値に置き換えます。curl -Hホスト: demo.alb.ingress.top -k https:// alb-******** .alb.aliyuncs.com -- cert client.crt -- key client.key
次の出力が返された場合、相互認証が設定されます。
古い
(オプション) ステップ5: 相互認証の無効化
次のコマンドを実行して、AlbConfigを変更します。
kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME> をAlbConfigの名前に置き換えます。
相互認証を無効にするには、caEnabledフィールドを
false
に設定します。apiVersion: alibabacloud.com/v1 kind: AlbConfig メタデータ: name: #... spec: config: #... リスナー: - port: 443 protocol: HTTPS caEnabled: false# 値をfalseに設定します。 caCertificates: -CertificateId: 0e40dda998174723af39d37fcaf ***** 証明書: #...
関連ドキュメント
リスナーに対してHTTP/3を有効にするには、「QUICリスナーを使用してHTTP/3をサポートする」をご参照ください。
webサービスが侵入に対して脆弱であるか、より高いセキュリティが必要な場合は、WAF対応のApplication Load Balancer (ALB) インスタンスを使用できます。 詳細については、「WAF対応のALBインスタンスを使用したアプリケーションの保護」をご参照ください。