このガイドでは、ホスト名単位 の Authenticated Origin Pulls を設定し、mutual TLS verify ↗ を使って AWS Application Load Balancer に安全に接続する方法を説明します。
- AWS アカウントと EC2 ↗ は、すでに設定済みである必要があります。
- このチュートリアルでは、カスタム証明書の生成にコマンドラインインターフェース(CLI)を使い、Cloudflare Authenticated Origin Pulls の設定に API 呼び出し を使います。
- AWS の最新のセットアップ手順は、AWS のドキュメント ↗ を参照してください。
- 次のコマンドを実行して、AES-256 暗号化を使った 4096 ビットの RSA 秘密鍵を生成します。プロンプトが表示されたらパスフレーズを入力します。
openssl genrsa -aes256 -out rootca.key 4096- CA ルート証明書を作成します。プロンプトが表示されたら、証明書に含める情報を入力します。
Common Nameフィールドにはホスト名ではなく、ドメイン名を指定します。
openssl req -x509 -new -nodes -key rootca.key -sha256 -days 1826 -out rootca.crt- 証明書署名要求(CSR)を作成します。プロンプトが表示されたら、要求に含める情報を入力します。
Common Nameフィールドにはホスト名を指定します。
openssl req -new -nodes -out cert.csr -newkey rsa:4096 -keyout cert.key- 前の手順で作成した
rootca.keyとrootca.crtを使って証明書に署名します。
openssl x509 -req -in cert.csr -CA rootca.crt -CAkey rootca.key -CAcreateserial -out cert.crt -days 730 -sha256 -extfile ./cert.v3.ext- 証明書拡張ファイル
cert.v3.extに次の内容が指定されていることを確認します。
basicConstraints=CA:FALSErootca.certを S3 バケット ↗ にアップロードします。- EC2 コンソールで トラストストアを作成 ↗ し、証明書をアップロードした S3 URI を指定します。
- EC2 インスタンスを作成し、HTTPD デーモンをインストールします。インスタンスタイプ ↗ は要件に合わせて選んでください。AWS Free Tier ↗ 対象の最小構成でも構いません。このチュートリアルは、t2.micro と Amazon Linux 2023 ↗ を使った例に基づいています。
sudo yum install -y httpd
sudo systemctl start httpd- Application Load Balancer 用の ターゲットグループ ↗ を作成します。
- ターゲットタイプは Instances を選びます。
- ポートは
HTTP/80を指定します。
- ターゲットグループの設定が終わったら、ターゲットグループが 正常 ↗ であることを確認します。
- ロードバランサーとリスナーを設定 ↗ します。
- スキームは Internet-facing を選びます。
- mTLS オプションを使えるように、リスナーをポート
443に切り替え、前の手順で作成したターゲットグループを選びます。 - Default SSL/TLS server certificate では Import certificate > Import to ACM を選び、証明書の秘密鍵と本文を追加します。
- Client certificate handling では Verify with trust store を選びます。
- 設定を保存します。
- (任意)次のコマンドを実行し、Application Load Balancer がクライアント証明書を要求していることを確認します。
openssl s_client -verify 5 -connect <your-application-load-balancer>:443 -quiet -stateまだ証明書を Cloudflare にアップロードしていないため、接続は失敗するはずです(例: read:errno=54)。
curl --verbose を実行し、SSL/TLS ハンドシェイク内に Request CERT (13) があることも確認できます。
curl --verbose https://<your-application-load-balancer>
...
* TLSv1.2 (IN), TLS handshake, Request CERT (13):
...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
))
# Push the certificate
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"- その証明書を使うホスト名に 証明書を関連付けます。
Required API token permissions
At least one of the following token permissions is required:SSL and Certificates Write
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/origin_tls_client_auth/hostnames" \
--request PUT \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"config": [
{
"enabled": true,
"cert_id": "<CERT_ID>",
"hostname": "<YOUR_HOSTNAME>"
}
]
}'-
PUTリクエスト を使い、ホスト名の Authenticated Origin Pulls を無効にします。
At least one of the following token permissions is required:Required API token permissions
SSL and Certificates Write
Enable or Disable a Hostname for Client Authenticationbash curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/origin_tls_client_auth/hostnames" \ --request PUT \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \ --json '{ "config": [ { "enabled": false, "cert_id": "<CERT_ID>", "hostname": "<YOUR_HOSTNAME>" } ] }' -
(任意)
GETリクエスト を使い、クライアント証明書 ID の一覧を取得します。次の手順で削除する証明書の ID が必要です。
At least one of the following token permissions is required:Required API token permissions
SSL and Certificates WriteSSL and Certificates Read
List Certificatesbash curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/origin_tls_client_auth/hostnames/certificates" \ --request GET \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" -
Delete hostname client certificate エンドポイントを使い、アップロード済みの証明書を削除します。
At least one of the following token permissions is required:Required API token permissions
SSL and Certificates Write
Delete Hostname Client Certificatebash curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/origin_tls_client_auth/hostnames/certificates/$CERTIFICATE_ID" \ --request DELETE \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"