Indy ondersteunt ALPN (Application Layer Protocol Negotiation)

· Functies

ALPN, of Application Layer Protocol Name, is een TLS-extensie die de protocolonderhandeling onderdeel maakt van de uitwisseling van hello-berichten. ALPN kan onderhandelen welk protocol over een beveiligde verbinding moet worden afgehandeld, op een manier die efficiënter is en extra round trips voorkomt. Het steeds populairdere HTTP/2-protocol gebruikt ALPN om laadtijden van websites verder te verlagen en verbindingen sneller te versleutelen.

Volgens de specificatie van RFC 7301 stuurt de client met ALPN een lijst van ondersteunde applicatieprotocollen naar de server als onderdeel van het TLS ClientHello-bericht. De server kiest vervolgens een protocol en stuurt dat protocol terug in zijn ServerHello-bericht. De onderhandeling van het applicatieprotocol kan zo binnen één round trip van de TLS-handshake worden afgerond. Met deze methode kan de server ook een ander certificaat aan elk applicatieprotocol koppelen.

Vanaf sgcWebSockets 4.3.2 kun je het ALPN-protocol gebruiken als je sgcWebSockets compileert met onze aangepaste Indy-bibliotheek. Indy implementeert dit protocol standaard niet.

Client 

Maak een nieuwe WebSocket-client die "h2" vereist voor ALPN; controleer na het verbinden welk protocol de server heeft geaccepteerd.

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

 Maak een nieuwe WebSocket-server die controleert of de client "h2"-ALPN-verbindingen ondersteunt.

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;