Desde sgcWebSockets 4.5.1 SChannel se ha mejorado con 2 nuevas funcionalidades:
1. Hay una nueva propiedad en TLSOptions.SChannel_Options llamada CipherList donde puedes establecer qué cifrados se usarán.
2. Hay una nueva función llamada GetInfo que devuelve información como el protocolo usado (TLS1.2, TLS1.1...), el cifrado, la fortaleza del cifrado... y más
Lista de cifrados
Por defecto, usando SChannel, el cliente usará los cifrados configurados en el sistema. Si quieres personalizar los cifrados usados, puedes usar la propiedad TLSOptions_SChannel_Options.CipherList para establecer qué cifrados se usarán para conectarse a un servidor seguro.
Ejemplo: si estableces en la lista de cifrados los siguientes valores "CALG_AES_256:CALG_AES_128", significa que primero el cliente intentará conectarse usando AES256 y, si no puede, usará AES128.
Puedes leer la lista completa de cifrados en la documentación de Microsoft.
https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
Información de la conexión
Una vez que el cliente se ha conectado al servidor seguro, puedes solicitar información sobre qué versión está usando (TLS 1.2, TLS 1.3...), el cifrado utilizado, la fortaleza... y más.
Llama a la función GetInfo del SChannel Handler para acceder a esta información. Puedes acceder al SSL Handler mediante el método OnSSLAfterCreateHandler, que se llama después de crear el SChannel Handler. Después de que el cliente se conecte al servidor y si el SSL Handler está asignado, llama a la función GetInfo y, si tiene éxito, devolverá los datos de la conexión.
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;
