Indy supports ALPN (Application Layer Protocol Negotiation)

· Fonctionnalités

ALPN ou Application Layer Protocol Name est une extension TLS qui inclut la négociation de protocole dans l'échange des messages hello. ALPN permet de négocier quel protocole doit être traité sur une connexion sécurisée d'une manière plus efficace et qui évite des allers-retours supplémentaires. Le protocole HTTP/2, dont la popularité ne cesse de croître, utilise ALPN pour réduire encore les temps de chargement des sites et chiffrer les connexions plus rapidement.

Selon la spécification RFC 7301, avec ALPN le client envoie une liste de protocoles applicatifs supportés au serveur dans le cadre du message TLS ClientHello. Le serveur sélectionne ensuite un protocole et le renvoie dans son message ServerHello. La négociation de protocole applicatif peut donc se faire en un seul aller-retour dans le handshake TLS. Cette méthode permet aussi au serveur d'associer un certificat différent à chaque protocole applicatif.

Depuis sgcWebSockets 4.3.2, si tu compiles sgcWebSockets avec notre bibliothèque Indy personnalisée, tu peux utiliser le protocole ALPN. Indy n'implémente pas ce protocole par défaut.

Client 

Crée un nouveau client websocket qui exige « h2 » pour ALPN ; après la connexion, vérifie quel protocole le serveur a accepté.

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;

Serveur

 Crée un nouveau client websocket qui vérifie si le client prend en charge les connexions ALPN « h2 ».

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;