SChannel cipherlijst en verbindingsinfo

· Functies

Vanaf sgcWebSockets 4.5.1 is SChannel verbeterd met 2 nieuwe functies:

1. Er is een nieuwe eigenschap in TLSOptions.SChannel_Options genaamd CipherList waarin je kunt instellen welke ciphers gebruikt worden.

2. Er is een nieuwe functie genaamd GetInfo die informatie teruggeeft zoals het gebruikte protocol (TLS1.2, TLS1.1...), de cipher, de cipher-sterkte... en meer

Cipherlijst 

Standaard gebruikt de client bij SChannel de ciphers die in het systeem zijn geconfigureerd. Als je de gebruikte ciphers wilt aanpassen, kun je de eigenschap TLSOptions_SChannel_Options.CipherList gebruiken om in te stellen welke ciphers gebruikt worden om verbinding te maken met een beveiligde server.

Voorbeeld: als je in de cipherlijst de volgende waarden "CALG_AES_256:CALG_AES_128" instelt, betekent dit dat de client eerst probeert verbinding te maken met AES256, en als dat niet lukt, AES128 gebruikt. 

De volledige cipherlijst kun je lezen in de Microsoft-documentatie.

https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

Verbindingsinfo 

Zodra de client verbinding heeft gemaakt met de beveiligde server, kun je informatie opvragen over welke versie wordt gebruikt (TLS 1.2, TLS 1.3...), de gebruikte cipher, de sterkte... en meer.

Roep de functie GetInfo van de SChannel-handler aan om deze informatie op te vragen. Je hebt toegang tot de SSL-handler via de methode OnSSLAfterCreateHandler, die wordt aangeroepen nadat de SChannel-handler is aangemaakt. Nadat de client verbinding maakt met de server en als de SSL-handler is toegewezen, roep je de functie GetInfo aan; indien succesvol geeft deze de verbindingsdata terug.

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;