SChannel の暗号スイート一覧と接続情報

· 機能

sgcWebSockets 4.5.1 から SChannel に 2 つの新機能が追加されました:

1. TLSOptions.SChannel_Options に CipherList という新しいプロパティが追加され、使用する暗号を設定できます。

2. GetInfo という新しい関数が追加され、使用中のプロトコル(TLS1.2・TLS1.1 など)・暗号・暗号強度などの情報を返します。

暗号リスト

デフォルトでは SChannel を使用する際、クライアントはシステムで設定された暗号を使用します。使用する暗号をカスタマイズする場合は、TLSOptions_SChannel_Options.CipherList プロパティを使用してセキュアサーバーへの接続に使用する暗号を設定できます。

例:暗号リストに「CALG_AES_256:CALG_AES_128」を設定すると、クライアントはまず AES256 で接続を試み、できない場合は AES128 を使用します。

完全な暗号リストは Microsoft のドキュメントで確認できます。

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

接続情報

クライアントがセキュアサーバーに接続した後、使用中のバージョン(TLS 1.2・TLS 1.3 など)・使用された暗号・強度などの情報をリクエストできます。

SChannel ハンドラーの GetInfo 関数を呼び出してこの情報にアクセスします。SChannel ハンドラーの作成後に呼び出される OnSSLAfterCreateHandler メソッドを使用して SSL ハンドラーにアクセスできます。クライアントがサーバーに接続し、SSL ハンドラーが割り当てられている場合に GetInfo 関数を呼び出すと、成功すれば接続データが返されます。

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;