使用idHTTP在代理服务器后面发送发布请求

时间:2017-08-08 09:30:41

标签: http delphi proxy

我在使用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'.

1 个答案:

答案 0 :(得分:0)

  

使用SSL连接时出错   错误:1408F10B:SSL例程:SSL3_GET_RECORD:错误的版本号

该错误意味着您没有使用目标HTTPS服务器愿意接受的SSL / TLS版本。这就是握手失败的原因。这与使用代理无关。

在您的代码中,您要设置 BOTH SSLOptions.MethodSSLOptions.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