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;
