ALPN, ou Application Layer Protocol Name, é uma extensão TLS que inclui a negociação de protocolo durante a troca de mensagens hello. O ALPN é capaz de negociar qual protocolo deve ser utilizado em uma conexão segura de forma mais eficiente e sem viagens adicionais de ida e volta. O protocolo HTTP/2, cada vez mais popular, faz uso do ALPN para diminuir ainda mais os tempos de carregamento de sites e criptografar conexões mais rapidamente.
De acordo com a especificação RFC 7301, com o ALPN o cliente envia uma lista de protocolos de aplicação suportados ao servidor como parte da mensagem TLS ClientHello. O servidor então seleciona um protocolo e o devolve em sua mensagem ServerHello. A negociação do protocolo de aplicação pode, portanto, ser concluída em uma única viagem de ida e volta dentro do handshake TLS. Esse método também permite que o servidor associe um certificado diferente a cada protocolo de aplicação.
A partir do sgcWebSockets 4.3.2, se você compilar o sgcWebSockets com nossa biblioteca Indy personalizada, você pode usar o protocolo ALPN. O Indy por padrão não implementa esse protocolo.
Cliente
Crie um novo cliente WebSocket que requer "h2" para ALPN e verifique após a conexão qual protocolo o servidor aceitou.
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
Crie um novo servidor WebSocket que verifica se o cliente oferece suporte a conexões 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;
