SChannel: Lista de Cifras e Informações de Conexão

· Recursos

A partir do sgcWebSockets 4.5.1, o SChannel foi aprimorado com 2 novos recursos:

1. Há uma nova propriedade em TLSOptions.SChannel_Options chamada CipherList, onde você pode definir quais cifras serão usadas.

2. Há uma nova função chamada GetInfo, que retorna informações como o protocolo usado (TLS1.2, TLS1.1...), a cifra, a força da cifra... e muito mais.

Lista de Cifras 

Por padrão, usando o SChannel, o cliente utilizará as cifras configuradas no sistema. Se quiser personalizar as cifras usadas, você pode utilizar a propriedade TLSOptions_SChannel_Options.CipherList para definir quais cifras serão usadas na conexão a um servidor seguro.

Exemplo: se você definir na lista de cifras os valores "CALG_AES_256:CALG_AES_128", isso significa que primeiro o cliente tentará conectar usando AES256 e, se não conseguir, usará AES128. 

Você pode consultar a lista completa de cifras na documentação da Microsoft.

https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

Informações da Conexão 

Depois que o cliente se conectar ao servidor seguro, você pode solicitar informações sobre qual versão está sendo usada (TLS 1.2, TLS 1.3...), a cifra utilizada, a força... e muito mais.

Chame a função GetInfo do SChannel Handler para acessar essas informações. Você pode acessar o SSL Handler usando o evento OnSSLAfterCreateHandler, que é chamado após a criação do SChannel Handler. Depois que o cliente se conectar ao servidor e se o SSL Handler estiver atribuído, chame a função GetInfo e, se bem-sucedida, ela retornará os dados da conexão.

var
  SSL: TsgcIdSSLIOHandlerSocketSChannel;
oClient := TsgcWebSocketClient.Create(nil);
oClient.URL := 'wss://www.esegece.com:2053';
oClient.TLSOptions.Version := tls1_2;
oClient.TLSOptions.IOHandler := iohSChannel;
oClient.OnSSLAfterCreateHandler := OnSSLAfterCreateHandlerEvent;
oClient.OnConnect := OnConnectEvent;
oClient.Active := True;
procedure OnSSLAfterCreateHandlerEvent(Sender: TObject; aType: TwsSSLHandler; aSSLHandler: TIdSSLIOHandlerSocketBase);
begin
  if aSSLHandler.ClassType = TsgcIdSSLIOHandlerSocketSChannel  then
    SSL := TsgcIdSSLIOHandlerSocketSChannel(aSSLHandler);
end;
procedure OnConnectEvent(Connection: TsgcWSConnection);
var
  oInfo: TsgcSChannelConnectionInfo;
begin
  if Assigned(SSL) then
  begin
    oInfo := SSL.GetInfo;
    if (oInfo.Protocol <> tls1_2) then
      raise Exception.Create('Client cannot connect using TLS 1.2');
  end;
end;