ALPN o Application Layer Protocol Name è un'estensione TLS che include la negoziazione del protocollo nello scambio dei messaggi hello. ALPN è in grado di negoziare quale protocollo debba essere gestito su una connessione sicura in modo più efficiente ed evitando round trip aggiuntivi. Il protocollo HTTP/2, sempre più popolare, fa uso di ALPN per ridurre ulteriormente i tempi di caricamento dei siti web e cifrare le connessioni più velocemente.
Secondo la specifica RFC 7301, con ALPN il client invia un elenco dei protocolli applicativi supportati al server come parte del messaggio TLS ClientHello. Il server seleziona quindi un protocollo e lo rispedisce nel suo messaggio ServerHello. La negoziazione del protocollo applicativo può quindi essere effettuata in un solo round trip all'interno dell'handshake TLS. Questo metodo permette inoltre al server di associare un certificato diverso a ciascun protocollo applicativo.
Da sgcWebSockets 4.3.2, se compili sgcWebSockets con la nostra libreria Indy personalizzata puoi fare uso del protocollo ALPN. Indy per impostazione predefinita non implementa questo protocollo.
Client
Crea un nuovo client websocket che richiede "h2" per ALPN, dopo la connessione controlla quale protocollo è stato accettato dal server.
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
Crea un nuovo client websocket che controlla se il client supporta connessioni 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;
