Cookie の設定を選択する

当社は、当社のサイトおよびサービスを提供するために必要な必須 Cookie および類似のツールを使用しています。当社は、パフォーマンス Cookie を使用して匿名の統計情報を収集することで、お客様が当社のサイトをどのように利用しているかを把握し、改善に役立てています。必須 Cookie は無効化できませんが、[カスタマイズ] または [拒否] をクリックしてパフォーマンス Cookie を拒否することはできます。

お客様が同意した場合、AWS および承認された第三者は、Cookie を使用して便利なサイト機能を提供したり、お客様の選択を記憶したり、関連する広告を含む関連コンテンツを表示したりします。すべての必須ではない Cookie を受け入れるか拒否するには、[受け入れる] または [拒否] をクリックしてください。より詳細な選択を行うには、[カスタマイズ] をクリックしてください。

Amazon EKS で実行されているアプリケーションの相互 TLS 認証を設定する - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon EKS で実行されているアプリケーションの相互 TLS 認証を設定する

作成者:マヘンドラ・シッダッパ (AWS)

概要

証明書ベースの相互 Transport Layer Security (TLS) は、サーバーとクライアント間の双方向ピア認証を提供するオプションの TLS コンポーネントです。相互 TLS では、クライアントはセッションネゴシエーションプロセス中に X.509 証明書を提供する必要があります。サーバーは、この証明書を使用してクライアントを識別し、認証します。

相互 TLS は、モノのインターネット (IoT) アプリケーションの一般的な要件であり、ビジネストゥビジネスアプリケーションやオープンバンキングなどの標準に使用できます。

このパターンでは、NGINX Ingress Controller を使用して Amazon Elastic Kubernetes Service (Amazon EKS) クラスターで実行されているアプリケーションの相互 TLS を設定する方法を説明します。イングレスリソースに注釈を付けることで、NGINX イングレスコントローラーのビルトイン相互 TLS 機能を有効にできます。NGINX コントローラーの相互 TLS アノテーションについて詳しくは、Kubernetes ドキュメントの「クライアント証明書認証」を参照してください。

重要

このパターンでは、自己署名証明書を使用します。このパターンはテストクラスターでのみ使用し、本番環境では使用しないことをお勧めします。このパターンを本番環境で使用する場合は、「AWS プライベート認証局 (AWS プライベート CA)」または既存のパブリックキーインフラストラクチャ (PKI) 標準を使用してプライベート証明書を発行できます。

前提条件と制限

前提条件

  • アクティブな Amazon Web Services (AWS)アカウント。

  • 既存の アマゾン EKS クラスター。

  • AWS コマンドラインインターフェイス(AWS CLI) バージョン 1.7 以降。macOS、Linux、または Windows にインストールされ、設定されている。

  • Amazon EKS クラスターにアクセスするためにインストールして設定した kubectl コマンドラインユーティリティ。詳細については、Amazon EKS ドキュメントの「kubectl のインストール」を参照してください。

  • アプリケーションをテストするための既存のドメインネームシステム (DNS) 名。

機能制限

  • このパターンでは、自己署名証明書を使用します。このパターンはテストクラスターでのみ使用し、本番環境では使用しないことをお勧めします。

アーキテクチャ

Amazon EKS で実行されているアプリケーションの相互 TLS 認証の設定

テクノロジースタック

  • Amazon EKS

  • Amazon Route 53

  • kubectl

ツール

  • Amazon Elastic Kubernetes Service (Amazon EKS)」は、AWS で Kubernetes を実行する際に役立ち、独自の Kubernetes コントロールプレーンまたはノードをインストールまたは維持する必要はありません。

  • Amazon Route 53 は、高可用性でスケーラブルな DNS Web サービスです。

  • Kubectl」は、Amazon EKS クラスターを操作するために使用するコマンドラインユーティリティです。

エピック

タスク説明必要なスキル

CA キーと証明書を生成します。

次のコマンドを実行して、証明機関 (CA) キーと証明書を生成します。

openssl req -x509 -sha256 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 356 -nodes -subj '/CN=Test Cert Authority'
DevOps エンジニア

サーバーキーと証明書を生成し、CA 証明書で署名します。

サーバーキーと証明書を生成し、次のコマンドを実行して CA 証明書で署名します。

openssl req -new -newkey rsa:4096 -keyout server.key -out server.csr -nodes -subj '/CN= <your_domain_name> ' && openssl x509 -req -sha256 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
重要

を既存のドメイン名<your_domain_name>に置き換えてください。

DevOps エンジニア

クライアントキーと証明書を生成し、CA 証明書で署名します。

クライアントキーと証明書を生成し、次のコマンドを実行して CA 証明書で署名します。

openssl req -new -newkey rsa:4096 -keyout client.key -out client.csr -nodes -subj '/CN=Test' && openssl x509 -req -sha256 -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt
DevOps エンジニア

自己署名証明書を生成します

タスク説明必要なスキル

CA キーと証明書を生成します。

次のコマンドを実行して、証明機関 (CA) キーと証明書を生成します。

openssl req -x509 -sha256 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 356 -nodes -subj '/CN=Test Cert Authority'
DevOps エンジニア

サーバーキーと証明書を生成し、CA 証明書で署名します。

サーバーキーと証明書を生成し、次のコマンドを実行して CA 証明書で署名します。

openssl req -new -newkey rsa:4096 -keyout server.key -out server.csr -nodes -subj '/CN= <your_domain_name> ' && openssl x509 -req -sha256 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
重要

を既存のドメイン名<your_domain_name>に置き換えてください。

DevOps エンジニア

クライアントキーと証明書を生成し、CA 証明書で署名します。

クライアントキーと証明書を生成し、次のコマンドを実行して CA 証明書で署名します。

openssl req -new -newkey rsa:4096 -keyout client.key -out client.csr -nodes -subj '/CN=Test' && openssl x509 -req -sha256 -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt
DevOps エンジニア
タスク説明必要なスキル

Amazon EKS クラスターに NGINX イングレスコントローラーをデプロイします。

次のコマンドを使用して、NGINX イングレスコントローラをデプロイします。

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/aws/deploy.yaml
DevOps エンジニア

NGINX Ingress Controller サービスが実行中であることを確認します。

以下のコマンドを使用して、NGINX イングレスコントローラサービスが実行されていることをを確認します。

kubectl get svc -n ingress-nginx
重要

サービスアドレスのフィールドに Network Load Balancer のドメイン名が含まれていることを確認します。

DevOps エンジニア

NGINX イングレスコントローラーをデプロイします。

タスク説明必要なスキル

Amazon EKS クラスターに NGINX イングレスコントローラーをデプロイします。

次のコマンドを使用して、NGINX イングレスコントローラをデプロイします。

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/aws/deploy.yaml
DevOps エンジニア

NGINX Ingress Controller サービスが実行中であることを確認します。

以下のコマンドを使用して、NGINX イングレスコントローラサービスが実行されていることをを確認します。

kubectl get svc -n ingress-nginx
重要

サービスアドレスのフィールドに Network Load Balancer のドメイン名が含まれていることを確認します。

DevOps エンジニア
タスク説明必要なスキル

Amazon EKS クラスターにネームスペースを作成します。

次のコマンドを実行して、Amazon EKS クラスターに mtls という名前の名前空間を作成します。

kubectl create ns mtls

これにより、相互 TLS をテストするためのサンプルアプリケーションがデプロイされます。

DevOps エンジニア

Amazon EKS クラスターにネームスペースを作成して、相互 TLS をテストします。

タスク説明必要なスキル

Amazon EKS クラスターにネームスペースを作成します。

次のコマンドを実行して、Amazon EKS クラスターに mtls という名前の名前空間を作成します。

kubectl create ns mtls

これにより、相互 TLS をテストするためのサンプルアプリケーションがデプロイされます。

DevOps エンジニア
タスク説明必要なスキル

Kubernetes デプロイメントとサービスを mtls 名前空間に作成します。

mtls.yaml という名前のファイルを作成します。ファイルに次のコードを貼り付けます。

kind: Deployment apiVersion: apps/v1 metadata: name: mtls-app labels: app: mtls spec: replicas: 1 selector: matchLabels: app: mtls template: metadata: labels: app: mtls spec: containers: - name: mtls-app image: hashicorp/http-echo args: - "-text=mTLS is working" --- kind: Service apiVersion: v1 metadata: name: mtls-service spec: selector: app: mtls ports: - port: 5678 # Default port for image

次のコマンドを実行して、mtls 名前空間に Kubernetes デプロイとサービスを作成します。

kubectl create -f mtls.yaml -n mtls
DevOps エンジニア

Kubernetes デプロイが作成されていることを確認します。

デプロイが作成され、1 つのポッドが使用可能になっていることを確認するには、次のコマンドを実行します。

kubectl get deploy -n mtls
DevOps エンジニア

Kubernetes サービスが作成されていることを確認します。

次のコマンドを実行して、Kubernetes サービスが作成されたことを確認します。

kubectl get service -n mtls
DevOps エンジニア

サンプルアプリケーションのデプロイとサービスを作成します。

タスク説明必要なスキル

Kubernetes デプロイメントとサービスを mtls 名前空間に作成します。

mtls.yaml という名前のファイルを作成します。ファイルに次のコードを貼り付けます。

kind: Deployment apiVersion: apps/v1 metadata: name: mtls-app labels: app: mtls spec: replicas: 1 selector: matchLabels: app: mtls template: metadata: labels: app: mtls spec: containers: - name: mtls-app image: hashicorp/http-echo args: - "-text=mTLS is working" --- kind: Service apiVersion: v1 metadata: name: mtls-service spec: selector: app: mtls ports: - port: 5678 # Default port for image

次のコマンドを実行して、mtls 名前空間に Kubernetes デプロイとサービスを作成します。

kubectl create -f mtls.yaml -n mtls
DevOps エンジニア

Kubernetes デプロイが作成されていることを確認します。

デプロイが作成され、1 つのポッドが使用可能になっていることを確認するには、次のコマンドを実行します。

kubectl get deploy -n mtls
DevOps エンジニア

Kubernetes サービスが作成されていることを確認します。

次のコマンドを実行して、Kubernetes サービスが作成されたことを確認します。

kubectl get service -n mtls
DevOps エンジニア
タスク説明必要なスキル

イングレスリソースにシークレットを作成します。

以下のコマンドを実行して、前に作成した証明書を使用して NGINX Ingress コントローラーのシークレットを作成します。

kubectl create secret generic mtls-certs --from-file=tls.crt=server.crt --from-file=tls.key=server.key --from-file=ca.crt=ca.crt -n mtls

シークレットには、サーバーを識別するためのクライアント用のサーバー証明書と、クライアント証明書を検証するためのサーバー用の CA 証明書があります。

DevOps エンジニア

mtls 名前空間にシークレットを作成します。

タスク説明必要なスキル

イングレスリソースにシークレットを作成します。

以下のコマンドを実行して、前に作成した証明書を使用して NGINX Ingress コントローラーのシークレットを作成します。

kubectl create secret generic mtls-certs --from-file=tls.crt=server.crt --from-file=tls.key=server.key --from-file=ca.crt=ca.crt -n mtls

シークレットには、サーバーを識別するためのクライアント用のサーバー証明書と、クライアント証明書を検証するためのサーバー用の CA 証明書があります。

DevOps エンジニア
タスク説明必要なスキル

mtls 名前空間にイングレスリソースを作成します。

ingress.yaml という名前のファイルを作成します。ファイルに次のコードを貼り付けます (<your_domain_name> を既存のドメイン名に置き換えます)。

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/auth-tls-verify-client: "on" nginx.ingress.kubernetes.io/auth-tls-secret: mtls/mtls-certs name: mtls-ingress spec: ingressClassName: nginx rules: - host: "*.<your_domain_name>" http: paths: - path: / pathType: Prefix backend: service: name: mtls-service port: number: 5678 tls: - hosts: - "*.<your_domain_name>" secretName: mtls-certs

次のコマンドを実行して、mtls ネームスペースに Ingress リソースを作成します。

kubectl create -f ingress.yaml -n mtls

つまり、NGINX Ingress コントローラーはトラフィックをサンプルアプリケーションにルーティングできます。

DevOps エンジニア

Ingress リソースが作成されていることを確認します。

次のコマンドを実行して、Ingress リソースが作成されたことを確認します。

kubectl get ing -n mtls
重要

Ingress リソースのアドレスに、NGINX Ingress Controller 用に作成されたロードバランサーが表示されていることを確認します。

DevOps エンジニア

mtls 名前空間に Ingress リソースを作成します。

タスク説明必要なスキル

mtls 名前空間にイングレスリソースを作成します。

ingress.yaml という名前のファイルを作成します。ファイルに次のコードを貼り付けます (<your_domain_name> を既存のドメイン名に置き換えます)。

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/auth-tls-verify-client: "on" nginx.ingress.kubernetes.io/auth-tls-secret: mtls/mtls-certs name: mtls-ingress spec: ingressClassName: nginx rules: - host: "*.<your_domain_name>" http: paths: - path: / pathType: Prefix backend: service: name: mtls-service port: number: 5678 tls: - hosts: - "*.<your_domain_name>" secretName: mtls-certs

次のコマンドを実行して、mtls ネームスペースに Ingress リソースを作成します。

kubectl create -f ingress.yaml -n mtls

つまり、NGINX Ingress コントローラーはトラフィックをサンプルアプリケーションにルーティングできます。

DevOps エンジニア

Ingress リソースが作成されていることを確認します。

次のコマンドを実行して、Ingress リソースが作成されたことを確認します。

kubectl get ing -n mtls
重要

Ingress リソースのアドレスに、NGINX Ingress Controller 用に作成されたロードバランサーが表示されていることを確認します。

DevOps エンジニア
タスク説明必要なスキル

NGINX Ingress コントローラーのロードバランサーを指す CNAME レコードを作成します。

AWS マネジメントコンソールにサインインし、Amazon Route 53 コンソールを開いて、NGINX イングレスコントローラーのロードバランサーに mtls.<your_domain_name> を指す正規名 (CNAME) レコードを作成します。

詳細については、Route 53 ドキュメントの「Route 53 コンソールを使用したレコードの作成」を参照してください。

DevOps エンジニア

ホスト名がロードバランサーを指すように DNS を設定します。

タスク説明必要なスキル

NGINX Ingress コントローラーのロードバランサーを指す CNAME レコードを作成します。

AWS マネジメントコンソールにサインインし、Amazon Route 53 コンソールを開いて、NGINX イングレスコントローラーのロードバランサーに mtls.<your_domain_name> を指す正規名 (CNAME) レコードを作成します。

詳細については、Route 53 ドキュメントの「Route 53 コンソールを使用したレコードの作成」を参照してください。

DevOps エンジニア
タスク説明必要なスキル

証明書なしで相互 TLS セットアップをテストする。

以下のコマンドを実行してください。

curl -k https://mtls.<your_domain_name>

「400 必要な SSL 証明書は送信されませんでした」というエラー応答が表示されるはずです。

DevOps エンジニア

証明書を使用して相互 TLS セットアップをテストします。

以下のコマンドを実行してください。

curl -k https://mtls.<your_domain_name> --cert client.crt --key client.key

「mTLS は動作しています」という応答が返されるはずです。

DevOps エンジニア

アプリケーションをテストする

タスク説明必要なスキル

証明書なしで相互 TLS セットアップをテストする。

以下のコマンドを実行してください。

curl -k https://mtls.<your_domain_name>

「400 必要な SSL 証明書は送信されませんでした」というエラー応答が表示されるはずです。

DevOps エンジニア

証明書を使用して相互 TLS セットアップをテストします。

以下のコマンドを実行してください。

curl -k https://mtls.<your_domain_name> --cert client.crt --key client.key

「mTLS は動作しています」という応答が返されるはずです。

DevOps エンジニア

関連リソース

プライバシーサイト規約Cookie の設定
© 2025, Amazon Web Services, Inc. or its affiliates.All rights reserved.