Application-Layer Protocol Negotiation (ALPN) について
ALPN(Application-Layer Protocol Negotiation)は、TLS(
Transport Layer Security)の拡張の一つであり、
アプリケーション層でのプロトコルネゴシエーションを効率的に行うための仕組みです。TLSによるセキュアな通信において、どの
アプリケーション層プロトコル(例えば
HTTP/2|HTTP_2やHTTP/1.1など)を使用するかを決定する際に、不要な通信の往復(ラウンドトリップタイム)を削減し、
アプリケーション層のプロトコルに依存しないネゴシエーションを可能にします。
ALPNの主な役割
効率的なプロトコル選択: 通信開始時に、クライアントとサーバーがサポートするプロトコルを事前に決定することで、無駄な通信を省きます。
柔軟なプロトコル対応: HTTP/2|HTTP_2のような新しいプロトコルや、その他のカスタムプロトコルにも対応可能で、柔軟なシステム構築を支援します。
セキュリティの向上: 近年では、ALPACAと呼ばれるクロスプロトコル攻撃への対策としても、ALPNの利用が推奨されています。これにより、より安全な通信が実現できます。
標準仕様
ALPNの仕様は、2014年7月11日にRFC 7301として公開され、インターネット標準として採用されています。
RFC 7301: ALPNの基本的な仕様を定義しています。
RFC 7639: HTTP CONNECTメソッドを使用する場合に、ALPN HTTPヘッダーを規定しています。
NPN(Next Protocol Negotiation)との関係
NPNは、ALPNと同様の目的で開発されたプロトコルネゴシエーションの拡張です。Google ChromeでTLSの高速化のために導入されたTLS False Startには、セキュリティ上の問題がありました。そのため、GoogleはNPNを開発し、Chrome 20以降でNPN対応サイト以外ではTLS False Startを無効化しました。
しかし、NPNは後にALPNに置き換えられました。Google Chromeはバージョン51でNPNのサポートを終了しています。
ALPNのサポート状況
ALPNは、以下の主要なライブラリでサポートされています。
GnuTLS: 3.2.0 (2013年5月リリース) 以降
MatrixSSL: 3.7.1 (2014年12月リリース) 以降
Network Security Services (NSS): 3.15.5 (2014年4月リリース) 以降
OpenSSL: 1.0.2 (2015年1月リリース) 以降
LibreSSL: 2.1.3 (2015年1月リリース) 以降
mbed TLS: 1.3.6 (2014年4月リリース) 以降
SChannel: 8.1 / 2012 R2以降
まとめ
ALPNは、TLSにおける重要な拡張機能であり、セキュアな通信における効率的なプロトコル選択を可能にします。
HTTP/2|HTTP_2をはじめとする最新のプロトコルをサポートし、セキュリティ対策としてもその利用が推奨されています。また、NPNという前身技術から発展し、現在の標準となっています。
参考資料
RFC 7301: Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension
RFC 7639: The ALPN HTTP Header Field
NPN Google Technical Note
Transport Layer Security (TLS) Next Protocol Negotiation Extension draft-agl-tls-nextprotoneg-04