HTTPS 相互認証メカニズムは、サーバーとクライアントが相互のアイデンティティを検証できるようにします。金融、IoT、企業内部サービス、個人情報を取り扱う公共サービス部門などのシナリオでは、HTTPS 相互認証を使用して情報セキュリティを保証できます。
HTTPS 片方向認証と HTTPS 相互認証の比較
HTTPS 片方向認証: クライアントはサーバーから SSL または TLS 証明書をダウンロードしてサーバーのアイデンティティを検証し、安全なチャネルを確立します。サーバーはクライアントのアイデンティティを検証できません。
HTTPS 相互認証: クライアントはサーバーから SSL または TLS 証明書をダウンロードしてサーバーのアイデンティティを検証します。同時に、クライアントは自身の SSL または TLS 証明書をアイデンティティの証明としてサーバーに送信します。クライアントとサーバーが相互のアイデンティティを検証した後にのみ、安全なチャネルが確立されます。ほとんどの場合、サーバーは認証局 (CA) 証明書を保持し、クライアントはルート CA 証明書に基づいて署名および発行された SSL または TLS 証明書を保持します。したがって、サーバーはクライアントのアイデンティティを検証できます。HTTPS 相互認証を使用すると、信頼できるクライアントにのみサービスを公開できるため、中間者攻撃を防ぎ、サービスセキュリティを強化できます。
前提条件
暗号化通信のための HTTPS 証明書の設定の手順に従って、SSL または TLS 証明書が設定されていること。
ルート CA 証明書を取得していること。ルート CA 証明書は、次のいずれかの方法で取得できます。
証明書管理サービスコンソールで証明書を購入する。詳細については、プライベート CA の購入と有効化を参照してください。
このトピックの手順に従って、自己署名証明書を生成する。
(オプション) ステップ 1: 自己署名ルート CA 証明書を生成する
次の手順を実行して、ルート CA 証明書を生成し、証明書を証明書管理サービスコンソールにアップロードできます。
次のコマンドを実行して、秘密鍵を作成します。
openssl genrsa -out ca.key 4096
次のコマンドを実行して、証明書署名要求 (CSR) を作成します。
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 []:
次の表に、パラメーターを示します。
パラメーター
説明
国名
国コード。2 文字のコードです。たとえば、cn は中国を表します。このパラメーターは必須です。
都道府県名
都道府県名。このパラメーターは必須です。
市区町村名
市区町村名。このパラメーターは必須です。
組織名
組織名。たとえば、会社名です。このパラメーターは必須です。
組織単位名
組織単位名。このパラメーターは必須です。
共通名
証明書が使用されるドメイン名。このパラメーターはオプションです。
メールアドレス
証明書管理者に連絡するために使用されるメールアドレス。このパラメーターはオプションです。
チャレンジパスワード
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 ファイルは、CA に送信された CSR です。ca.key ファイルは秘密鍵です。ca.key ファイルと ca.crt ファイルは、ステップ 7 で自己署名ルート CA 証明書を設定するために使用されます。
重要秘密鍵は機密にしておく必要があります。
証明書管理サービスコンソールにログインします。左側のナビゲーションペインで、証明書アプリケーションリポジトリをクリックします。
証明書アプリケーションリポジトリページで、リポジトリの作成をクリックします。リポジトリの作成パネルで、次のパラメーターを設定し、OK をクリックします。
パラメーター
説明
リポジトリ名
リポジトリの名前。カスタム名を指定できます。
データソース
この例では、アップロードされた証明書をクリックし、サードパーティの証明書サービスプロバイダーから購入および発行されたプライベート証明書を選択します。
証明書アプリケーションリポジトリページで、作成したリポジトリをクリックします。証明書の管理ページで、アップロードされた証明書をクリックします。
CA 情報パネルで、次の表に基づいてパラメーターを設定して、ステップ 3 で作成した CA 証明書をアップロードし、確認して有効化をクリックします。
パラメーター
説明
パッケージ名
アップロードする証明書のカスタム名を入力します。
CA 証明書
アップロードする証明書の PEM エンコードファイルの内容を入力します。
テキストエディターを使用して、PEM または CRT 形式の証明書ファイルを開くことができます。次に、内容をCA 証明書フィールドにコピーします。アップロードをクリックして、オンプレミスコンピューターから証明書ファイルを選択して、ファイルの内容をアップロードすることもできます。
証明書キー
アップロードする証明書の PEM エンコードファイルの内容を入力します。
ステップ 2: クライアント証明書を生成する
証明書管理サービスコンソールからクライアント証明書を購入できます。自己署名 CA 証明書を使用してクライアント証明書を発行することもできます。
次の例では、ステップ 1 で作成した自己署名 CA 証明書を使用してクライアント証明書を発行し、作成した自己署名クライアント証明書とサーバー証明書に基づいてリスナーの相互認証を有効にします。
次のコマンドを実行して、クライアント証明書の秘密鍵を生成します。
openssl genrsa -out client.key 4096
次のコマンドを実行して、クライアント証明書を作成するための CSR を生成します。
openssl req -new -out client.csr -key client.key
次のコマンドを実行して、クライアント証明書を生成します。
openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650
CA と CAkey は、ステップ 1 で作成したルート証明書に対応します。
上記の手順を実行した後、
ls
コマンドを実行して、現在のディレクトリに生成されたクライアント証明書を表示します。client.crt client.csr client.key
ステップ 3: リスナーの相互認証を有効にする AlbConfig を作成する
ステップ 1 で作成したサーバー証明書を、AlbConfig の Certificates パラメーターで指定します。証明書はデフォルトのサーバー証明書として設定されます。
証明書管理サービスコンソールにログインします。左側のナビゲーションペインで、SSL 証明書をクリックします。
SSL 証明書ページで、[アクション] 列のアイコンをクリックし、詳細をクリックします。
証明書の詳細パネルで、証明書情報を表示できます。
ステップ 1 で作成したルート証明書の識別子を、AlbConfig の CaCertificates パラメーターの CertificateId フィールドで指定します。
証明書管理サービスコンソールにログインします。左側のナビゲーションペインで、証明書アプリケーションリポジトリをクリックします。
証明書アプリケーションリポジトリページで、作成したリポジトリをクリックします。証明書の管理ページで、詳細をクリックします。
証明書の詳細パネルで、証明書の識別子を表示できます。
AlbConfig 設定のサンプル:
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb-demo
spec:
config:
name: alb-test
addressType: Intranet
# 異なるゾーンにある少なくとも 2 つの vSwitch を指定します。ゾーンが Application Load Balancer (ALB) でサポートされており、クラスターと同じ仮想プライベートクラウド (VPC) に属していることを確認してください。
zoneMappings:
- vSwitchId: vsw-2zednnurkug2xl4******
- vSwitchId: vsw-2zeusdspvojoumx******
listeners:
- port: 443
protocol: HTTPS
caEnabled: true
caCertificates:
- CertificateId: 0e40dda998174723af39d37fcaf*****
certificates:
- CertificateId: 108*****-cn-hangzhou
IsDefault: true
ステップ 4: 相互認証をテストする
coffee.yaml という名前のファイルを作成し、次のコードブロックをファイルにコピーします。このファイルは、Ingress によって公開されるテストサービスをデプロイするために使用されます。このサービスは、ステップ 3 で設定したリスナーに関連付けられています。
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 # このドメイン名の DNS レコードを追加します。 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 created
ステップ 2 で生成したクライアント証明書を使用して、サービスにアクセスします。
ALB コンソールにログインします。上部のナビゲーションバーで、ALB インスタンスがデプロイされているリージョンを選択します。
インスタンスページで、ALB インスタンスをクリックします。
インスタンスの詳細ページのゾーンセクションで、ALB インスタンスの vSwitch に関連付けられているエラスティック IP アドレス (EIP) を取得します。
hosts ファイルに DNS レコードを追加して、ドメイン名を EIP にマップします。
123.XX.XX.XX alb.ingress.alibaba.com
DNS レコードが追加された後、ドメイン名を使用してサービスにアクセスできます。
alb.ingress.alibaba.com を使用する実際のドメイン名に置き換えます。また、client.crt ファイルと client.key ファイルのパスも指定する必要があります。 curl https://alb.ingress.alibaba.com/ --cert client.crt --key client.key
コマンドを実行すると、サーバーは HTML ページにリダイレクトする応答を返します。
参考資料
ALB の使用中にエラーが発生した場合は、まず ALB のドキュメントを参照してください。詳細については、ALB Ingress コントローラーのトラブルシューティングとALB Ingress に関する FAQを参照してください。