我一直在使用:
Delphi XE8
Indy版本10.6.2.5263
预编译的开放SSL DLL文件(Win 32bit)v1.0.2.l
TIdSSLIOHandlerSocketOpenSSL
Method
设置为sslvSSLv23
向服务器提交POST请求。它在很多个月里都像是一种魅力。
突然间,出现了一个疯狂的错误:
14094410 sslv3警报握手失败。
一位同事正在使用SOAP UI通过强制TLS 1.2来针对同一服务器提交请求,并且它可以正常工作。我尝试将TIdSSLIOHandlerSocketOpenSSL1
方法设置为sslvTLSv1_2
,并将模式更改为sslmClient
,但结果始终相同。
我认为通过将方法设置为sslvTLSv1_2
,无法收到与SSLv3相关的错误。
我已检查过这些stackoverflow帖子:
以及其他一些主题,但我无法找到此问题的根本原因。
也许我错过了什么。你能给我一个提示吗?
答案 0 :(得分:1)
有同样的问题,下面的源代码就像一个魅力。我从这个网站复制了这段代码,但我找不到归功于原始答案的链接。 请注意,源代码不是我的。
TCustomIdHTTP = class(TIdHTTP)
public
constructor Create(AOwner: TComponent);
private
procedure OnStatusInfoEx(ASender: TObject; const AsslSocket: PSSL; const AWhere, Aret: TIdC_INT; const AType, AMsg: String);
end;
constructor TCustomIdHTTP.Create(AOwner: TComponent);
begin
IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
with IOHandler as TIdSSLIOHandlerSocketOpenSSL do
begin
OnStatusInfoEx := Self.OnStatusInfoEx;
SSLOptions.Method := sslvSSLv23;
SSLOptions.SSLVersions := [sslvTLSv1_2, sslvTLSv1_1, sslvTLSv1];
end;
inherited Create(AOwner);
end;
procedure TCustomIdHTTP.OnStatusInfoEx(ASender: TObject; const AsslSocket: PSSL;
const AWhere, Aret: TIdC_INT; const AType, AMsg: String);
begin
SSL_set_tlsext_host_name(AsslSocket, Request.Host);
end;
答案 1 :(得分:0)
我自己也有一些网站遇到同样的问题。我使用TRESTClient
代替TIdHTTP
和OpenSSL
解决了这个问题。
TRESTClient
TRESTRequest
TRESTResponse
您可以在Delphi IDE的“工具”菜单中的REST调试器中设置URL,身份验证和参数,并将组件复制到剪贴板,以便您抢先一步。
答案 2 :(得分:0)
确保您的应用程序文件夹中有最新的libeay32.dll和ssleay32.dll