我在使用IdHTTP和IdSSL在代理服务器后发送帖子请求时遇到问题,
不确定我的代码或代理服务器和帖子中是否缺少某些内容,我已尽力而为。 我得到错误10061连接被拒绝,连接超时。
使用Delphi XE8
var
Params: TStrings;
lHTTP: TIdHTTP;
IdSSL: TIdSSLIOHandlerSocketOpenSSL;
begin
TThread.CreateAnonymousThread(procedure ()
begin
Params := TStringList.Create;
lHTTP := TIdHTTP.Create(nil);
try
IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(lHTTP);
IdSSL.SSLOptions.Method := sslvTLSv1_2;
IdSSL.SSLOptions.SSLVersions := [sslvSSLv3];
lHTTP.IOHandler := IdSSL;
lHTTP.HandleRedirects := True;
Params.Add('username=myuser');
Params.Add('password=mypass');
try
lHTTp.ProxyParams.ProxyServer := '177.104.200.15';
lHTTp.ProxyParams.ProxyPort := 35923;
lHTTp.ReadTimeout := 60000;
lHTTp.Connect('instagram.com', 80);
lHTTP.Request.Accept := '*/*';
lHTTP.Request.AcceptLanguage := 'en-US,en;q=0.5';
lHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
lHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0';
Reply := lHTTP.Post('https://Instagram.com/login', Params);
TThread.Synchronize(TThread.CurrentThread,
procedure()
begin
memo3.lines.add(reply);
end);
IdSSl.Free;
lHTTP.Free;
except on E: EIdHTTPProtocolException do
begin
TThread.Synchronize (TThread.CurrentThread,
procedure ()
begin
memo3.lines.add(E.ErrorMessage);
end);
end;
end;
except on E: EIdHTTPProtocolException do
begin
TThread.Synchronize (TThread.CurrentThread,
procedure ()
begin
memo3.lines.add(E.ErrorMessage);
end);
end;
end;
end).Start;
end;
更新
错误讯息:First chance exception at $751A2502. Exception class EIdOSSLUnderlyingCryptoError with message
'Error connecting with SSL.
error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number'.
UPDATE2 使用
IdSSL.SSLOptions.Method := sslvSSLv23; // enable all available versions first
IdSSL.SSLOptions.SSLVersions := IdSSL.SSLOptions.SSLVersions - [sslvSSLv2, sslvSSLv3];
给出错误:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol'.
答案 0 :(得分:0)
使用SSL连接时出错 错误:1408F10B:SSL例程:SSL3_GET_RECORD:错误的版本号
该错误意味着您没有使用目标HTTPS服务器愿意接受的SSL / TLS版本。这就是握手失败的原因。这与使用代理无关。
在您的代码中,您要设置 BOTH SSLOptions.Method
和SSLOptions.SSLVersions
属性。 不要这样做!它们是互斥的,设置一个更新另一个。您首先将SSLOptions.Method
设置为sslvTLSv1_2
,然后将SSLOptions.SSLVersions
设置为sslvSSLv3
,这会将SSLOptions.Method
更改为sslvSSLv3
以匹配。因此,您尝试使用SSL 3.0连接到HTTPS服务器,许多服务器因为已被盗用而不再接受。
使用 ONE OR THE OTHER 属性,而不是两者:
IdSSL.SSLOptions.Method := sslvTLSv1_2;
//IdSSL.SSLOptions.SSLVersions := [sslvSSLv3]; // <-- get rid of this
或者:
//IdSSL.SSLOptions.Method := sslvTLSv1_2; // <-- get rid of this
IdSSL.SSLOptions.SSLVersions := [sslvTLSv1_2]; // <-- and change this from SSL 3.0 to TLS 1.2
在后一种情况下,您应该更喜欢启用所有可用的TLS 1.x版本,以便更多的HTTPS服务器更广泛地接受使用TLS 1.0和TLS 1.1但不使用TLS 1.2:
IdSSL.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
或者,随着新的TLS版本被添加到OpenSSL中,以便将来验证代码:
IdSSL.SSLOptions.Method := sslvSSLv23; // enable all available versions first
IdSSL.SSLOptions.SSLVersions := IdSSL.SSLOptions.SSLVersions - [sslvSSLv2, sslvSSLv3]; // then remove compromised versions