SChannel Cipher List and Connection Info

· Funktionen

Ab sgcWebSockets 4.5.1 wurde SChannel um 2 neue Funktionen erweitert:

1. Es gibt eine neue Eigenschaft in TLSOptions.SChannel_Options namens CipherList, mit der du festlegen kannst, welche Ciphers verwendet werden.

2. Es gibt eine neue Funktion namens GetInfo, die Informationen wie das verwendete Protokoll (TLS1.2, TLS1.1...), den Cipher, die Cipher-Stärke... und mehr zurückgibt

Cipher List 

Bei Verwendung von SChannel nutzt der Client standardmäßig die im System konfigurierten Ciphers. Wenn du die verwendeten Ciphers anpassen möchtest, kannst du die Eigenschaft TLSOptions_SChannel_Options.CipherList nutzen, um festzulegen, welche Ciphers zur Verbindung mit einem sicheren Server verwendet werden.

Beispiel: Wenn du in der Cipher List die folgenden Werte "CALG_AES_256:CALG_AES_128" setzt, bedeutet das, dass der Client zuerst versucht, sich mit AES256 zu verbinden, und falls das nicht möglich ist, AES128 verwendet. 

Die vollständige Cipher-Liste findest du in der Microsoft-Dokumentation.

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

Verbindungsinformationen 

Sobald der Client mit dem sicheren Server verbunden ist, kannst du Informationen darüber abrufen, welche Version verwendet wird (TLS 1.2, TLS 1.3...), welcher Cipher genutzt wird, die Stärke... und mehr.

Rufe die Funktion GetInfo des SChannel Handlers auf, um auf diese Informationen zuzugreifen. Du kannst über die Methode OnSSLAfterCreateHandler auf den SSL Handler zugreifen; sie wird nach der Erstellung des SChannel Handlers aufgerufen. Nachdem der Client mit dem Server verbunden ist und falls der SSL Handler zugewiesen wurde, rufe die Funktion GetInfo auf; sie gibt im Erfolgsfall die Verbindungsdaten zurück.

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;