コンテンツにスキップ

AWS統合

このガイドでは、相互TLS検証を使用して、AWSアプリケーションロードバランサーに安全に接続するためのホスト名ごとの認証済みオリジンプルの設定方法を説明します。

Cloudflareでこの設定をロールバックする方法についての指示も見つけることができます。

始める前に

  • すでにAWSアカウントとEC2が設定されている必要があります。
  • このチュートリアルでは、カスタム証明書を生成するためにコマンドラインインターフェース(CLI)を使用し、Cloudflare認証済みオリジンプルを設定するためにAPI呼び出しを使用します。
  • AWSの設定方法に関する最新のドキュメントについては、AWSドキュメントを参照してください。

1. カスタム証明書を生成する

  1. 次のコマンドを実行して、AES-256暗号化を使用して4096ビットRSAプライベートキーを生成します。プロンプトが表示されたらパスフレーズを入力します。
Terminal window
openssl genrsa -aes256 -out rootca.key 4096
  1. CAルート証明書を作成します。プロンプトが表示されたら、証明書に含める情報を入力します。Common Nameフィールドには、ホスト名ではなくドメイン名を値として使用します。
Terminal window
openssl req -x509 -new -nodes -key rootca.key -sha256 -days 1826 -out rootca.crt
  1. 証明書署名要求(CSR)を作成します。プロンプトが表示されたら、要求に含める情報を入力します。Common Nameフィールドには、ホスト名を値として使用します。
Terminal window
openssl req -new -nodes -out cert.csr -newkey rsa:4096 -keyout cert.key
  1. 前のステップで作成したrootca.keyrootca.crtを使用して証明書に署名します。
Terminal window
openssl x509 -req -in cert.csr -CA rootca.crt -CAkey rootca.key -CAcreateserial -out cert.crt -days 730 -sha256 -extfile ./cert.v3.ext
  1. 証明書拡張ファイルcert.v3.extが次のように指定されていることを確認します。
basicConstraints=CA:FALSE

2. AWSアプリケーションロードバランサーを設定する

  1. rootca.cert S3バケットにアップロードします。
  2. EC2コンソールで信頼ストアを作成し、証明書をアップロードしたS3 URIを指定します。
  3. EC2インスタンスを作成し、HTTPDデーモンをインストールします。必要に応じてインスタンスタイプを選択します - AWS Free Tierに適格な最小インスタンスでも構いません。このチュートリアルは、t2.microとAmazon Linux 2023を使用した例に基づいています。
Terminal window
sudo yum install -y httpd
sudo systemctl start httpd
  1. アプリケーションロードバランサー用のターゲットグループを作成します。
    • ターゲットタイプとしてインスタンスを選択します。
    • ポートHTTP/80を指定します。
  2. ターゲットグループの設定が完了したら、ターゲットグループが正常であることを確認します。
  3. ロードバランサーとリスナーを設定します。
    • インターネット向けスキームを選択します。
    • リスナーをポート443に切り替え、mTLSオプションを利用可能にし、前のステップで作成したターゲットグループを選択します。
    • デフォルトSSL/TLSサーバー証明書には、証明書をインポート > ACMにインポートを選択し、証明書のプライベートキーと本文を追加します。
    • クライアント証明書の処理の下で、信頼ストアで検証を選択します。
  4. 設定を保存します。
  5. (オプション)次のコマンドを実行して、アプリケーションロードバランシングがクライアント証明書を要求していることを確認します。
Terminal window
openssl s_client -verify 5 -connect <your-application-load-balancer>:443 -quiet -state

まだ証明書をCloudflareにアップロードしていないため、接続は失敗するはずです(例:read:errno=54)。

curl --verboseを実行して、SSL/TLSハンドシェイク内にRequest CERT (13)が存在することを確認することもできます:

Terminal window
curl --verbose https://<your-application-load-balancer>
...
* TLSv1.2 (IN), TLS handshake, Request CERT (13):
...

3. Cloudflareを設定する

  1. ステップ1で作成した証明書をCloudflareにアップロードします。ルートCAではなく、リーフ証明書を使用する必要があります。
Terminal window
MYCERT="$(cat cert.crt|perl -pe 's/\r?\n/\\n/'|sed -e 's/..$//')"
MYKEY="$(cat cert.key|perl -pe 's/\r?\n/\\n/'|sed -e's/..$//')"
request_body=$(< <(cat <<EOF
{
"certificate": "$MYCERT",
"private_key": "$MYKEY",
"bundle_method":"ubiquitous"
}
EOF
))
# 証明書をプッシュ
curl --silent \
"https://api.cloudflare.com/client/v4/zones/$ZONEID/origin_tls_client_auth/hostnames/certificates" \
--header "Content-Type: application/json" \
--header "X-Auth-Email: $MYAUTHEMAIL" \
--header "X-Auth-Key: $MYAUTHKEY" \
--data "$request_body"
  1. 使用するホスト名に対して証明書を関連付けるします。
Terminal window
curl --silent --request PUT \
"https://api.cloudflare.com/client/v4/zones/$ZONEID/origin_tls_client_auth/hostnames" \
--header "Content-Type: application/json" \
--header "X-Auth-Email: $MYAUTHEMAIL" \
--header "X-Auth-Key: $MYAUTHKEY" \
--data '{
"config": [
{
"enabled": true,
"cert_id": "<CERT_ID>",
"hostname": "<YOUR_HOSTNAME>"
}
]
}'
  1. ゾーンで認証済みオリジンプル機能を有効にします。
Terminal window
curl --request PATCH \
"https://api.cloudflare.com/client/v4/zones/$ZONEID/settings/tls_client_auth" \
--header "X-Auth-Email: $MYAUTHEMAIL" \
--header "X-Auth-Key: $MYAUTHKEY" \
--header "Content-Type: application/json" \
--data '{
"value": "on"
}'

Cloudflare設定のロールバック

  1. ホスト名で認証済みオリジンプルを無効にするためにPUTリクエストを使用します。
Terminal window
curl -s --request PUT \
"https://api.cloudflare.com/client/v4/zones/$ZONEID/origin_tls_client_auth/hostnames" \
--header "Content-Type: application/json" \
--header "X-Auth-Email: $MYAUTHEMAIL" \
--header "X-Auth-Key: $MYAUTHKEY" \
--data '{
"config": [
{
"enabled": false,
"cert_id": "<CERT_ID>",
"hostname": "<YOUR_HOSTNAME>"
}
]
}'
  1. (オプション)GETリクエストを使用してクライアント証明書IDのリストを取得します。次のステップで削除したい証明書のIDが必要です。
Terminal window
curl "https://api.cloudflare.com/client/v4/zones/$ZONEID/origin_tls_client_auth/hostnames/certificates" \
--header "X-Auth-Email: $MYAUTHEMAIL" \
--header "X-Auth-Key: $MYAUTHKEY"
  1. アップロードした証明書を削除するためにホスト名クライアント証明書を削除エンドポイントを使用します。
Terminal window
curl --request DELETE \
"https://api.cloudflare.com/client/v4/zones/$ZONEID/origin_tls_client_auth/hostnames/certificates/$CERTID" \
--header "X-Auth-Email: $MYAUTHEMAIL" \
--header "X-Auth-Key: $MYAUTHKEY"