À partir de sgcWebSockets 4.5.1, SChannel a été amélioré avec 2 nouvelles fonctionnalités :
1. Une nouvelle propriété TLSOptions.SChannel_Options appelée CipherList te permet de définir quels chiffrements seront utilisés.
2. Une nouvelle fonction GetInfo renvoie les informations comme le protocole utilisé (TLS 1.2, TLS 1.1...), le chiffrement, la force du chiffrement... et plus encore.
Liste de chiffrements
Par défaut, avec SChannel, le client utilise les chiffrements configurés dans le système. Si tu veux personnaliser les chiffrements utilisés, tu peux utiliser la propriété TLSOptions_SChannel_Options.CipherList pour définir quels chiffrements seront utilisés pour se connecter à un serveur sécurisé.
Exemple : si tu définis dans la liste de chiffrements les valeurs « CALG_AES_256:CALG_AES_128 », cela signifie que le client essaiera d'abord de se connecter avec AES256, puis avec AES128 s'il ne peut pas.
Tu peux consulter la liste complète des chiffrements dans la documentation Microsoft.
https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
Infos de connexion
Une fois le client connecté au serveur sécurisé, tu peux demander des informations sur la version utilisée (TLS 1.2, TLS 1.3...), le chiffrement utilisé, sa force... et plus encore.
Appelle la fonction GetInfo du handler SChannel pour accéder à ces informations. Tu peux accéder au handler SSL via la méthode OnSSLAfterCreateHandler, appelée après la création du handler SChannel. Une fois le client connecté au serveur et si le handler SSL est assigné, appelle la fonction GetInfo ; en cas de succès, elle renvoie les données de la connexion.
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;
