2017-08-08 72 views
0

我有送身后IdHTTP和IdSSL代理服务器后请求的问题,代理服务器POST请求,发送后面使用idHTTP

不知道是否有东西在我的代码或与代理服务器失踪和后,我已经尽力了。 我有时错误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; 

UPDATE

错误消息

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

你能使用Web浏览器访问服务器?你可以发布到其他服务器(例如https://httpbin.org/)吗? – mjn42

+0

我不能@ mjn42 –

+0

你实际使用什么样的代理? 'TIdHTTP.ProxyParams'属性只适用于HTTP代理(并且HTTPS要求代理支持'CONNECT' HTTP方法)。对于其他代理,比如SOCKS,你必须为TIdHTTP.Socket.TransparentProxy属性指定一个合适的组件(比如'TIdSocksInfo'),而不是先分配(TIdHTTP.IOHandler属性)。 –

回答

0

Error connecting with SSL.
error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number

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

在您的代码中,您正在设置BOTHSSLOptions.MethodSSLOptions.SSLVersions属性。 不要这样做!它们是互斥的,设置一个更新另一个。您首先将SSLOptions.Method设置为sslvTLSv1_2,但之后您将SSLOptions.SSLVersions设置为sslvSSLv3,这会将SSLOptions.Method更改为sslvSSLv3以匹配。因此,您正试图使用​​SSL 3.0连接到HTTPS服务器,许多服务器因其已被入侵而不再接受。

使用一个或另一个财产,而不是两个:

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 
+0

检查更新2,是否因为代理服务器和端口? ,我用这个时间151.80.100.147:62007,但仍然 –

+0

直到* TIdHTTP指示代理创建到目标HTTPS服务器的原始TCP隧道,并且该连接成功后,才执行SSL/TLS握手,则握手是直接使用HTTPS服务器执行的。 “未知协议”错误意味着OpenSSL收到的数据不是握手的“ServerHello”数据包。例如,如果服务器(或代理)发回未加密的HTML代替。代理发送了它不应该有的东西(或者'TIdHTTP'没有正确地从套接字读取它),或者服务器没有在HTTPS端口上启用SSL/TLS。 –