Indy が ALPN(Application Layer Protocol Negotiation)をサポート

· 機能

ALPN(Application Layer Protocol Name)は、hello メッセージの交換内でプロトコルネゴシエーションを行う TLS 拡張です。ALPN は、より 効率的かつ追加のラウンドトリップを回避する 方法で、安全な接続上でどのプロトコルを処理すべきかをネゴシエートできます。人気が高まり続ける HTTP/2 プロトコル は、Web サイトの読み込み時間をさらに短縮し、接続をより高速に暗号化するために ALPN を利用しています。

RFC 7301 仕様 によると、ALPN ではクライアントは TLS ClientHello メッセージの一部として、サポートしているアプリケーションプロトコルのリストをサーバーに送信します。サーバーはプロトコルを選択し、ServerHello メッセージでそのプロトコルを返します。これにより、アプリケーションプロトコルのネゴシエーションは TLS ハンドシェイク内の単一のラウンドトリップで完了できます。この方法ではまた、サーバーが各アプリケーションプロトコルに異なる証明書を関連付けることもできます。

sgcWebSockets 4.3.2 から、当社のカスタム Indy ライブラリ で sgcWebSockets をコンパイルすると、ALPN プロトコルを利用できます。Indy はデフォルトではこのプロトコルを実装していません。

クライアント 

ALPN に「h2」を要求する新しい websocket クライアントを作成し、接続後にサーバーが受け入れたプロトコルを確認します。

oClient := TsgcWebSocketClient.Create(nil);
oClient.Host := '127.0.0.1';
oClient.Port := 443;
oClient.TLS := True;
oClient.TLSOptions.ALPNProtocols.Add('h2');
oClient.Active := True;
procedure OnClientConnect(Connection: TsgcWSConnection);
var
  vProtocol: string;
begin
  vProtocol := TsgcWSConnectionClient(Connection).ALPNProtocol;
end; 

サーバー

 クライアントが「h2」ALPN 接続をサポートしているか確認する新しい websocket クライアントを作成します。

oServer := TsgcWebSocketServer.Create(nil);
oServer.Port := 443;
oServer.SSL := True;
oServer.Active := True;
procedure OnServerSSLALPNSelect(Sender: TObject; aProtocols: TStringList; var aProtocol: string);
begin
  if aProtocols.IndexOf('h2') > -1 then
    aProtocol := 'h2';
end;