You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何识别Delphi Indy服务器的客户端是否采用TLS加密连接?

Delphi Indy TLS/非TLS混合连接判断方案

核心逻辑

TLS连接建立时,客户端会主动发送Client Hello握手包,其固定特征是:第一个字节为0x16(代表Handshake类型),第二个字节为0x03(对应SSL3.0/TLS1.x的版本高位)。我们可以利用这个特征在连接初期判断客户端是否使用TLS加密,再切换对应的通信模式。

具体实现步骤

  • 关闭SslHandler自动加密:将IdSSLIOHandlerSocketBase的PassThrough属性默认设为True,让连接初始为明文状态,不自动触发TLS握手。
  • 在OnConnect事件中检测握手包:
    1. 调用AContext.Connection.IOHandler.CheckForDataOnSource()等待客户端发送数据,设置合理超时(比如1-2秒,根据业务场景调整)。
    2. 若检测到数据,读取前2个字节进行特征匹配。
    3. 匹配成功则切换PassThrough为False,触发TLS握手;不匹配则保持明文模式处理后续通信。
  • 代码示例:
procedure TMainForm.IdTCPServer1Connect(AContext: TIdContext);
var
  Buffer: array[0..1] of Byte;
  ReadCount: Integer;
  SSLHandler: TIdSSLIOHandlerSocketBase;
begin
  SSLHandler := TIdSSLIOHandlerSocketBase(AContext.Connection.IOHandler);
  // 初始保持明文模式
  SSLHandler.PassThrough := True;

  // 等待客户端发数据,超时2秒
  if AContext.Connection.IOHandler.CheckForDataOnSource(2000) then
  begin
    ReadCount := AContext.Connection.IOHandler.ReadBytes(Buffer, 2, False);
    // 匹配TLS Client Hello特征
    if (ReadCount = 2) and (Buffer[0] = $16) and (Buffer[1] = $03) then
    begin
      SSLHandler.PassThrough := False;
      // 手动触发TLS握手(部分Indy版本需显式调用)
      SSLHandler.StartSSL;
    end;
  end;
end;
  • 注意事项:
    • 超时时间不能过短,避免因网络延迟误判客户端为非TLS连接。
    • 若业务协议有固定的明文起始标识,可结合该标识进一步区分,提升判断准确性。
    • 需确保客户端要么先发TLS握手包,要么先发明文协议数据,避免出现长时间无数据的情况。

内容的提问来源于stack exchange,提问作者Robe79

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 19:17:07