Amazon CloudFront の CloudFront-Viewer-ISP と CloudFront-Viewer-TLS-Details をオリジンで受け取ってみた

Amazon CloudFront の CloudFront-Viewer-ISP と CloudFront-Viewer-TLS-Details をオリジンで受け取ってみた

Amazon CloudFront の CloudFront-Viewer-ISP と CloudFront-Viewer-TLS-Details ヘッダーを、オリジンで受け取って確認しました。ISP 名が空白を含む文字列で届き、keyExchange の値で PQC かどうかを見分けられました。
2026.11.01

はじめに

2026年10月、Amazon CloudFront が CloudFront-Viewer-ISP と CloudFront-Viewer-TLS-Details の2つのヘッダーをオリジンへ転送できるようになりました。これらのヘッダーから、ビューワーの ISP 名や、PQC を含む鍵交換方式などの TLS 接続情報を確認できます。

https://aws.amazon.com/jp/about-aws/whats-new/2026/10/cloudfront-viewer-isp-post-quantum-visbility/

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/adding-cloudfront-headers.html

この記事では、2つのヘッダーを追加したオリジンリクエストポリシーをディストリビューションに紐づけ、オリジンに届いた値をアクセスログで確認します。

検証方法

オリジンリクエストポリシー

次の内容を origin-request-policy.json として保存します。2つのヘッダーは HeadersConfig に指定します。クエリパラメーター case をオリジンのログに残すため、QueryStringBehavior は all としました。

{
  "Name": "cfv-1031-viewer-isp-tls-details",
  "Comment": "Add CloudFront-Viewer-ISP and CloudFront-Viewer-TLS-Details to origin requests",
  "HeadersConfig": {
    "HeaderBehavior": "whitelist",
    "Headers": {
      "Quantity": 2,
      "Items": [
        "CloudFront-Viewer-ISP",
        "CloudFront-Viewer-TLS-Details"
      ]
    }
  },
  "CookiesConfig": {
    "CookieBehavior": "none"
  },
  "QueryStringsConfig": {
    "QueryStringBehavior": "all"
  }
}
aws cloudfront create-origin-request-policy \
  --origin-request-policy-config file://origin-request-policy.json

ディストリビューションのキャッシュビヘイビアで、作成したポリシーの ID を OriginRequestPolicyId に指定すると、2つのヘッダーがオリジンに届きます。

検証環境

項目 値
オリジン Amazon Linux 2023 の EC2、nginx 1.30.6。2つのヘッダーをアクセスログに記録
オリジンへの接続 Elastic IP の公開 DNS 名を指定し、HTTP 80 を使用
ディストリビューション 既定のドメイン(*.cloudfront.net)と既定の証明書。ビューワープロトコルは HTTPS のみ
キャッシュポリシー Managed-CachingDisabled。各リクエストをオリジンへ転送
クライアント Docker の alpine/openssl:latest(OpenSSL 3.5.9)で鍵交換グループを指定。ホストの curl 8.18.0(OpenSSL 3.5.9)ではグループを指定せずに接続
接続元 作業環境の1回線(グローバル IP は1つ)
nginx のログ形式(/etc/nginx/conf.d/viewer-log.conf)
log_format viewer escape=json
  '{"time":"$time_iso8601",'
  '"uri":"$request_uri",'
  '"status":$status,'
  '"viewer_isp":"$http_cloudfront_viewer_isp",'
  '"viewer_tls_details":"$http_cloudfront_viewer_tls_details"}';

access_log /var/log/nginx/viewer.log viewer;

OpenSSL のクライアント

Docker コンテナ内で、次のスクリプトを実行しました。引数は CloudFront のドメイン、鍵交換グループ、ログでリクエストを見分けるための case の値です。

#!/bin/sh
set -eu

DOMAIN="$1"
GROUP="$2"
CASE="$3"

(
  printf 'GET /?case=%s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n' \
    "$CASE" "$DOMAIN"
  sleep 3
) |
  openssl s_client \
    -connect "${DOMAIN}:443" \
    -servername "$DOMAIN" \
    -tls1_3 \
    -groups "$GROUP" \
    -brief 2>&1 |
  grep -E 'Protocol version|Ciphersuite|Negotiated TLS1.3 group|Peer Temp Key|HTTP/1.1|x-cache|error|alert'

実行例です。CloudFront のドメインはマスクしています。

./openssl-request.sh dxxxxxxxxxxxxx.cloudfront.net X25519MLKEM768 pqc-x25519mlkem768

sleep 3 で標準入力を開いたままにしています。これを省くと、TLS の接続情報は表示されても、リクエストがオリジンのログに記録されませんでした。

グループを指定しない接続も確認するため、ホストの curl から1回リクエストを送りました。

検証結果

CloudFront-Viewer-ISP

検証には KDDI 系の ISP 回線を使用しました。この1回線から送った6件では、CloudFront-Viewer-ISP の値はすべて au one net でした。今回の値は、空白を含む文字列のままオリジンに届きました。

CloudFront-Viewer-ISP は、CloudFront が ISP を特定できた場合にのみ追加されるため、オリジン側ではヘッダーがないリクエストも考慮する必要があります。

CloudFront-Viewer-TLS-Details

PQC を使った接続(X25519MLKEM768)で、オリジンに届いた値です。アクセスログの記録を整形して載せています。

{
  "tlsVersion": "TLSv1.3",
  "cipherSuite": "TLS_AES_128_GCM_SHA256",
  "handshakeType": "fullHandshake",
  "keyExchange": "X25519MLKEM768",
  "signatureScheme": "rsa_pss_rsae_sha256",
  "signaturePublicKeyType": "rsa2048"
}

従来型の接続(クライアントで X25519 を指定)の値です。

{
  "tlsVersion": "TLSv1.3",
  "cipherSuite": "TLS_AES_128_GCM_SHA256",
  "handshakeType": "fullHandshake",
  "keyExchange": "x25519",
  "signatureScheme": "rsa_pss_rsae_sha256",
  "signaturePublicKeyType": "rsa2048"
}

既定の *.cloudfront.net 証明書を使う今回のディストリビューションでは、PQC を使った接続でも署名スキームと証明書の公開鍵タイプは従来型の接続と同じ値でした。

keyExchange の値

CloudFront が対応する PQC の鍵交換方式は、X25519MLKEM768 と SecP256r1MLKEM768 の2種類で、TLS 1.3 でのみ使えます。

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/secure-connections-supported-viewer-protocols-ciphers.html

鍵交換のグループを1つに限定した5通りの接続の結果です。

クライアントが指定したグループ クライアント側の表示 オリジンに届いた keyExchange
X25519MLKEM768 Negotiated TLS1.3 group: X25519MLKEM768 X25519MLKEM768
SecP256r1MLKEM768 Negotiated TLS1.3 group: SecP256r1MLKEM768 SecP256r1MLKEM768
X25519 Peer Temp Key: X25519, 253 bits x25519
prime256v1 Peer Temp Key: ECDH, prime256v1, 256 bits secp256r1
secp384r1 Peer Temp Key: ECDH, secp384r1, 384 bits secp384r1

参考として、鍵交換グループを指定しない curl 8.18.0(OpenSSL 3.5.9)でも、今回の環境では X25519MLKEM768 が選択されました。

まとめ

オリジンリクエストポリシーに CloudFront-Viewer-ISP と CloudFront-Viewer-TLS-Details を追加し、ビューワーの ISP 名と、PQC を含む鍵交換方式をオリジンで確認できました。

接続元の ISP や鍵交換方式を、オリジン側での判定やログ記録に利用したい場合は、今回のアップデートをお試しください。

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事