印地 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;
我有一个网站,我 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;