Da sgcWebSockets 4.5.1 SChannel è stato migliorato con 2 nuove funzionalità:
1. C'è una nuova proprietà in TLSOptions.SChannel_Options chiamata CipherList dove puoi impostare quali Cipher verranno usati.
2. C'è una nuova funzione chiamata GetInfo che restituisce informazioni come il Protocol usato (TLS1.2, TLS1.1...), il cipher, cipher strength... e altro
Cipher list
Per impostazione predefinita, usando SChannel, il client userà i cipher configurati nel sistema. Se vuoi personalizzare i cipher usati, puoi usare la proprietà TLSOptions_SChannel_Options.CipherList per impostare quali Cipher saranno usati per connettersi a un server sicuro.
Esempio: se imposti nella cipher list i valori "CALG_AES_256:CALG_AES_128", significa che prima il client proverà a connettersi usando AES256 e, se non ci riesce, userà AES128.
Puoi leggere la cipher list completa dalla documentazione Microsoft.
https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
Info di connessione
Una volta che il client si è connesso al server sicuro, puoi richiedere informazioni su quale Version sta usando (TLS 1.2, TLS 1.3...), il cipher usato, la strength... e altro.
Chiama la funzione GetInfo dell'SChannel Handler per accedere a queste informazioni. Puoi accedere all'SSL Handler tramite il metodo OnSSLAfterCreateHandler, che viene chiamato dopo la creazione dell'SChannel Handler. Dopo che il client si è connesso al server, se l'SSL Handler è assegnato, chiama la funzione GetInfo: in caso di successo restituirà i dati della connessione.
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;
