SChannel – lista szyfrów i informacje o połączeniu

· Funkcje

Od sgcWebSockets 4.5.1 SChannel został ulepszony o 2 nowe funkcje:

1. W TLSOptions.SChannel_Options dostępna jest nowa właściwość CipherList, w której możesz ustawić, jakie szyfry będą używane.

2. Dostępna jest nowa funkcja GetInfo, która zwraca informacje takie jak używany protokół (TLS 1.2, TLS 1.1...), szyfr, siła szyfru i inne.

Cipher List 

Domyślnie, używając SChannel, klient korzysta z szyfrów skonfigurowanych w systemie. Jeśli chcesz dostosować używane szyfry, możesz użyć właściwości TLSOptions_SChannel_Options.CipherList, aby określić, jakie szyfry będą używane do łączenia się z bezpiecznym serwerem.

Example: if you set in the cipher list the following values "CALG_AES_256:CALG_AES_128", this means that first the client will try to connect using AES256 and if can't, will use AES128. 

Pełną listę szyfrów znajdziesz w dokumentacji Microsoft.

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

Connection Info 

Po połączeniu klienta z bezpiecznym serwerem możesz zapytać o informacje dotyczące używanej wersji (TLS 1.2, TLS 1.3...), używanego szyfru, jego siły i innych.

Wywołaj funkcję GetInfo handlera SChannel, aby uzyskać dostęp do tych informacji. Dostęp do handlera SSL możesz uzyskać za pomocą metody OnSSLAfterCreateHandler, wywoływanej po utworzeniu handlera SChannel. Po połączeniu klienta z serwerem i jeśli handler SSL jest przypisany, wywołaj funkcję GetInfo — w przypadku powodzenia zwróci dane połączenia.

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;