SChannel — liste de chiffrements et infos de connexion

· Fonctionnalités

À 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;