ALPN o Application Layer Protocol Name es una extensión TLS que incluye la negociación de protocolo dentro del intercambio de mensajes hello. ALPN es capaz de negociar qué protocolo debe gestionarse sobre una conexión segura de una forma que es más eficiente y evita round trips adicionales. El cada vez más popular protocolo HTTP/2 hace uso de ALPN para reducir aún más los tiempos de carga de sitios web y cifrar conexiones más rápido.
Según la especificación RFC 7301, con ALPN el cliente enviará una lista de protocolos de aplicación admitidos al servidor como parte del mensaje TLS ClientHello. El servidor entonces selecciona un protocolo y devuelve ese protocolo en su mensaje ServerHello. La negociación del protocolo de aplicación puede por lo tanto realizarse en un único round trip dentro del handshake TLS. Este método también permite al servidor asociar un certificado diferente a cada protocolo de aplicación.
Desde sgcWebSockets 4.3.2, si compilas sgcWebSockets con nuestra biblioteca Indy personalizada puedes hacer uso del protocolo ALPN. Indy por defecto no implementa este protocolo.
Cliente
Crea un nuevo cliente websocket que requiere "h2" para ALPN; comprueba tras conectar qué protocolo ha aceptado el servidor.
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;
Servidor
Crea un nuevo cliente websocket que comprueba si el cliente admite conexiones 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;
