インフラ用語集へ戻る

セキュリティ・認証 / TLS/PKI

ALPNとは

Application-Layer Protocol Negotiation。TLS handshake中にHTTP/2など、暗号化後に利用するアプリケーションプロトコルを合意する拡張です。

用語集内のカードを見る

この記事で学べること

ALPNを、定義だけで終わらせず、現場で出てくる場面、確認材料、見落としやすい点、関連語とのつながりまで順に確認できます。

  1. ALPNが決めるもの
  2. ClientHelloとServer選択を比べる
  3. CDN・LB・proxyの境界
  4. 障害時の切り分け
  5. 変更後の確認

Packet Story Lab

ALPNをシナリオで確認

正常系と障害系の通信フローを見比べ、用語がどの観測点に現れるかを確認できます。

学習対象: SNI、暗号方式、証明書検証、Finished正常なTLS 1.3 handshake結果: TLS ACTIVE / HTTP READYシナリオを開く 学習対象: 接続先hostnameと証明書SANの不一致TLS証明書エラー結果: HTTP送信前に停止シナリオを開く 学習対象: Client時刻とNot Afterの不一致TLSサーバー証明書期限切れ結果: HTTP送信前に停止シナリオを開く

ALPNが決めるもの

ALPNはApplication-Layer Protocol Negotiationの略で、TLS handshake中に暗号化後の通信で使うアプリケーションプロトコルを合意する拡張です。HTTPSではClientがh2やhttp/1.1などの候補を提示し、Serverが対応する1つを選びます。

ALPNはTLS versionや暗号スイートの選択とは別です。TLS 1.3が成立してもALPNが期待と違えば、HTTP/2を使えずHTTP/1.1へfallbackする、またはprotocol不一致で接続できない場合があります。

ClientHelloとServer選択を比べる

ClientHelloにはClientが利用できるALPN identifierが優先順で入ります。Serverは自分の対応範囲と照合し、ServerHello側で選択結果を返します。packet captureやopenssl、browserのNetwork情報では提示値と選択値を分けて確認します。

  • Clientがh2とhttp/1.1を提示しているか確認する。
  • Serverが選んだprotocolを記録する。
  • TLS終端点ごとの差を比較する。

CDN・LB・proxyの境界

利用者とCDN、CDNとLoad Balancer、Load BalancerとBackendでは別々のTLS接続やHTTP versionが使われることがあります。公開側でh2が選ばれても、Backend側はHTTP/1.1という構成は正常です。どのhopのALPNを見ているかを明記します。

  • Client側とOrigin側の接続を分離する。
  • CDNやLBのHTTP/2有効化を確認する。
  • 片系だけ設定が異ならないか確認する。

障害時の切り分け

ALPN不一致を疑うときは、先にDNS、TCP、TLS証明書検証がどこまで成功したかを確認します。証明書期限切れやSAN不一致はALPNとは別の停止理由です。TLSが成立しHTTP応答だけ異常なら、選択protocolとBackend対応を確認します。

  • SNI付きで実利用FQDNへ接続する。
  • ALPNなし、h2、http/1.1の結果を比較する。
  • browser、proxy、Server logを同時刻で突合する。

変更後の確認

HTTP/2有効化やTLS policy変更後は、ALPN選択、HTTP version、代表URL、API、streaming、長時間接続を確認します。単にh2と表示されたことだけで性能改善や互換性を断定しません。

証跡にはFQDN、接続IP、SNI、TLS version、Cipher、Client提示ALPN、Server選択ALPN、終端点を残します。

  • 主要Client種別で選択結果を確認する。
  • HTTP/1.1 fallbackの要否を確認する。
  • CDN、LB、Originの責任境界を記録する。

関連語

同じ主要カテゴリの用語

セキュリティ・認証の学習順

同じ主要カテゴリの用語をまとめて確認できます。現在の用語を起点に、前後の用語へ進むと文脈を保ったまま読み進められます。

InfraEngKit内の関連機能