Indy supports ALPN (Application Layer Protocol Negotiation)

· Funktionen

ALPN oder Application Layer Protocol Name ist eine TLS-Erweiterung, die die Protokollverhandlung in den Austausch der Hello-Nachrichten einbindet. ALPN kann aushandeln, welches Protokoll über eine sichere Verbindung verwendet werden soll — und zwar effizient und ohne zusätzliche Round Trips. Das immer beliebter werdende HTTP/2-Protokoll nutzt ALPN, um die Ladezeit von Websites weiter zu verkürzen und Verbindungen schneller zu verschlüsseln.

Gemäß der Spezifikation RFC 7301 sendet der Client mit ALPN eine Liste der unterstützten Anwendungsprotokolle als Teil der TLS-ClientHello-Nachricht an den Server. Der Server wählt dann ein Protokoll aus und gibt es in seiner ServerHello-Nachricht zurück. Die Verhandlung des Anwendungsprotokolls kann so innerhalb eines einzigen Round Trips im TLS-Handshake erfolgen. Diese Methode erlaubt dem Server außerdem, jedem Anwendungsprotokoll ein anderes Zertifikat zuzuordnen.

Ab sgcWebSockets 4.3.2 kannst du das ALPN-Protokoll nutzen, wenn du sgcWebSockets mit unserer angepassten Indy-Bibliothek kompilierst. Indy implementiert dieses Protokoll standardmäßig nicht.

Client 

Erstelle einen neuen WebSocket-Client, der "h2" als ALPN-Protokoll verlangt, und prüfe nach dem Verbinden, welches Protokoll der Server akzeptiert hat.

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; 

Server

 Erstelle einen neuen WebSocket-Server, der prüft, ob der Client "h2"-ALPN-Verbindungen unterstützt.

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;