TLS上でのプロトコルネゴシエーションの仕組み、NPNとALPN

(この記事は古いため、HTTP2.0と表記していますが、正しくはHTTP/2です)
(HTTP ConnectメソッドのALPNヘッダは「ALPN HTTP Headerとは」)

TLS-NPN(Next Protocol Negotiation)

SPDYはHTTPSと同一ポートで接続を受け付けるため、SPDYの通信を開始する前にどちらのプロトコルで通信するか決める必要がある。その方法としてTLS-NPNを用いる。これは、SSLハンドシェイク時に使用するプロトコルネゴシエーションも同時に行なってしまう方法である。TLS-NPNはGoogleによって仕様が策定されている(仕様URL)。


TLS-ALPN(Application Layer Protocol Negotiation)

HTTP2.0においても、このSSLハンドシェイク時にネゴシエーションをすることが検討されている。もともとNPNを使う予定もあったが、現在はTLS-ALPNとしてTLS WGで議論・仕様策定されている(仕様URL)。

Next Protocol Negotiationとの違いとしては

  • 使用出来るプロトコルのリストをクライアントが提示しサーバが選択する(プロトコルとしてサーバに決定権がある方が好ましい)
  • 選択できるプロトコルがリストになかった場合はhandshake alertを通知して切断する
  • Selected Protocolが暗号化されない
  • プロトコルが決定してから、クライアント証明書を提出できる

などがあげられる。


追記
ALPNもRFC化されていした
https://tools.ietf.org/html/rfc7301

OpenSSLがalpnに対応しました (openssl 1.0.2
http://d.hatena.ne.jp/ASnoKaze/20140327/1395938540