【问题标题】:Sending a post request behind a proxy server using idHTTP使用 idHTTP 在代理服务器后面发送 post 请求
【发布时间】:2017-08-08 09:30:41
【问题描述】:

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

更新2 使用

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'.

【问题讨论】:

  • 你能用你的浏览器访问服务器吗?可以发帖到其他服务器(例如httpbin.org)吗?
  • 我不能@mjn42
  • 您实际使用的是哪种代理? TIdHTTP.ProxyParams 属性仅适用于 HTTP 代理(并且 HTTPS 要求代理支持 CONNECT HTTP 方法)。对于其他代理,例如 SOCKS,您必须将适当的组件(例如 TIdSocksInfo)分配给 TIdHTTP.Socket.TransparentProxy 属性(在首先分配 TIdHTTP.IOHandler 属性之后)。
  • 我做了,但是另一个错误消息,请检查更新,有什么问题! @RemyLebeau
  • @P.R:您没有正确配置 SSLIOHandler。看我的回答。

标签: http delphi proxy


【解决方案1】:

使用 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 版本,以便更多使用 TLS 1.0 和 TLS 1.1 但尚未使用 TLS 1.2 的 HTTPS 服务器更广泛地接受:

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

【讨论】:

  • 检查更新2,是因为代理服务器和端口吗? ,我这次用的是 151.80.100.147:62007 但还是
  • SSL/TLS 握手直到 TIdHTTP 指示代理创建到目标 HTTPS 服务器的原始 TCP 隧道并且连接成功后才会执行,然后握手是直接与 HTTPS 服务器执行的。 “未知协议”错误意味着 OpenSSL 接收到的数据不是握手的ServerHello 数据包。例如,如果服务器(或代理)改为发回未加密的 HTML。代理发送了它不应该发送的内容(或者TIdHTTP 没有从套接字正确读取),或者服务器没有在 HTTPS 端口上启用 SSL/TLS。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多