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;
