印地 10 和 sslvTLSv1_2

Indy 10 and sslvTLSv1_2

我有一个网站,我 post 当前支持 TLS v1.1 和 TLS 1.2。他们很快将只允许 TLS ver 1.2 连接。为此,我将 Delphi 5 升级到了 Indy 10。

目前,我在代码中创建我的组件并且一切正常 运行 一次 3 个线程:

HTTp := TIdHttp.Create(nil);
      HTTP.OnSelectAuthorization := HTTPSelectAuthorization;
      HTTP.HTTPOptions := [hoInProcessAuth,hoForceEncodeParams,hoKeepOrigProtocol];

      HTTP.OnStatus := HTTPStatus;
      HTTP.OnWorkEnd := HTTPWorkEnd;
      HTTP.Request.ContentType := 'application/x-www-form-urlencoded';
      HTTP.ProxyParams.ProxyPort := ProxyPort;
      HTTP.ProxyParams.ProxyUsername := ProxyUserName;
      HTTP.ProxyParams.ProxyPassword := ProxyPassword;
      HTTP.ProxyParams.BasicAuthentication := ProxyBasicAuth;
    end;

    If UseSSL and (SSL = nil) then
    Begin
      SSL := TIDSSLIOHandlerSocketOpenSSL.Create(nil);
      SSL.SSLOptions.Mode := sslmClient;
      SSL.OnGetPassword := SSLGetPassword;
      SSL.SSLOptions.Method := sslvTLSv1_2;
      HTTP.IOHandler := SSL;
    end;

是否有事件可以告诉我在发送 post 时我当前实际连接的是哪个 TLS 版本?我不希望他们最终停止接受 TLS v1.1 连接时出现意外。

谢谢。

没有专门为此目的举办的活动。您必须直接查询底层 SSL 对象,例如在 OnStatus 事件中,使用 SSL_get_version() 函数。

但是,您正在将 Method 专门设置为 TLS 1.2,这就是 Indy 将使用的所有内容(只要您使用支持 1.2 的 OpenSSL 版本,否则 Indy 将自动回退到 1.0) .

附带说明一下,您的 UseSSL if 块应该看起来更像这样:

If UseSSL then
Begin
  If (SSL = nil) then
  Begin
    SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    SSL.SSLOptions.Mode := sslmClient;
    SSL.OnGetPassword := SSLGetPassword;
    SSL.SSLOptions.Method := sslvTLSv1_2;
  End;
  HTTP.IOHandler := SSL;
end;

这是一个如何获取有关 SSL 版本信息的示例。 (可能需要一些更新,因为我不使用最新的 Indy)

声明

  procedure IdSSLIOHandlerSocketOpenSSLStatusInfoEx(ASender: TObject;
    const AsslSocket: PSSL; const AWhere, Aret: Integer; const AType,
    AMsg: string);

分配

SSL.OnStatusInfoEx:=IdSSLIOHandlerSocketOpenSSLStatusInfoEx;

用法

procedure THttpThread.IdSSLIOHandlerSocketOpenSSLStatusInfoEx(ASender: TObject;
  const AsslSocket: PSSL; const AWhere, Aret: Integer; const AType,
  AMsg: string);
begin
  if AsslSocket.version = TLS1_VERSION then
    ...
end;