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;
