ИдентификаторHTTP + SOCKS + Socks5

Я получаю общую ошибку Indy при использовании клиентского компонента IdHTTP в сочетании с прокси-сервером SOCKS5 и использовании SSL.

  • Если я использую компонент IdHTTP с моим прокси-сервером SOCKS5 (и URL-адресом без https), все работает без проблем.
  • Если я использую компонент IdHTTP с URL-адресом SSL (и без прокси-сервера SOCKS5), все работает без проблем.
  • Если я использую компонент IdHTTP с URL-адресом SSL и прокси-сервером SOCKS5, я получаю следующую ошибку:

Line 405 выхода ошибки idSocks.pas (raise EIdSocksServerGeneralError.Create(RSSocksServerGeneralError);

Вот мой код

var
  HTTP            : TIdHTTP;
  Cookie          : TIdCookieManager;
  SSL             : TIdSSLIOHandlerSocketOpenSSL;
  Params          : TStringList;
  HTMLSource      : String;
  CurrentProxy    : String;
  ProxyPort       : Integer;
  ProxyHost       : String;
  ProxyUsername   : String;
  ProxyPW         : String;
begin
  Synchronize(AddItem);
  HTTP                          := TIdHTTP.Create(NIL);
  Cookie                        := TIdCookieManager.Create(HTTP);
  SSL                           := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
  HTTP.CookieManager            := Cookie;
  HTTP.IOHandler                := SSL;
  HTTP.HandleRedirects          := True;
  Params                        := TStringList.Create;
  HTTP.Request.UserAgent        := Task^.Useragent;
  try
    while True do begin
      if terminated then Exit;
      Params.Clear;
      Cookie.CookieCollection.Clear;
      if Task^.Proxytype >= 0 then begin      // if proxy enabled
        CurrentProxy            := Task^.Form.GetProxyFromPool;
        ProxyHost               := ParsingW(':', CurrentProxy, 1);
        ProxyPort               := strtoint(ParsingW(':', CurrentProxy, 2));
        HTTP.ConnectTimeout     := (Task^.Proxytimeout * 1000);
        if Task^.ProxyAuth then begin
          ProxyUsername         := ParsingW(':', CurrentProxy, 3);
          ProxyPW               := ParsingW(':', CurrentProxy, 4);
        end;
      end;
      if Task^.Proxytype = 0 then begin //HTTP(s)
        HTTP.ProxyParams.ProxyServer      := ProxyHost;
        HTTP.ProxyParams.ProxyPort        := ProxyPort;
        if Task^.ProxyAuth then begin
          HTTP.ProxyParams.ProxyUsername  := ProxyUsername;
          HTTP.ProxyParams.ProxyPassword  := ProxyPW;
        end;
      end;
      if (Task^.Proxytype = 1) or (Task^.Proxytype = 2) then begin   // Socks 4 or 5
        SSL.TransparentProxy := TIdSocksInfo.Create(HTTP);
        (SSL.TransparentProxy as TIdSocksInfo).Port             := ProxyPort;
        (SSL.TransparentProxy as TIdSocksInfo).Host             := ProxyHost;
        if Task^.ProxyAuth then begin
          (SSL.TransparentProxy as TIdSocksInfo).Username       := ProxyUsername;
          (SSL.TransparentProxy as TIdSocksInfo).Password       := ProxyPW;
          (SSL.TransparentProxy as TIdSocksInfo).Authentication := saUsernamePassword;
        end else begin
          (SSL.TransparentProxy as TIdSocksInfo).Authentication := saNoAuthentication;
        end;
        if (Task^.Proxytype = 1) then  (SSL.TransparentProxy as TIdSocksInfo).Version := svSocks4;
        if (Task^.Proxytype = 2) then  (SSL.TransparentProxy as TIdSocksInfo).Version := svSocks5;
      end;

Я что-то упустил или невозможно подключиться к сайту SSL с прокси-сервером Socks5?


person user2791785    schedule 25.09.2013    source источник


Ответы (1)


Тот факт, что вы получаете EIdSocksServerGeneralError, означает, что TIdHTTP успешно связывается с прокси-сервером SOCKS и проверяет ваш запрос на доступ к нему без аутентификации, но затем не может установить соединение с целевым сервером, который вы указали в своем HTTPS-адрес. Прокси-сервер отвечает с кодом ошибки 1 (общий сбой). Убедитесь, что URL-адрес точен. Либо прокси-сервер не может преобразовать имя хоста в IP-адрес (попробуйте указать IP-адрес вместо имени хоста в URL-адресе и посмотрите, будет ли это иметь значение), либо прокси-сервер не имеет допустимого маршрута для достижения этого IP-адреса, либо возникла какая-то другая ошибка. происходит на стороне прокси. Если у вас есть доступ к прокси-серверу, попробуйте просмотреть его журналы, чтобы увидеть, что на самом деле пошло не так.

person Remy Lebeau    schedule 25.09.2013
comment
Не могли бы вы написать пример для ssl + socks5? Я дал тебе награду :) - person Hidden; 10.10.2013
comment
Код, который вы показали, должен нормально работать для SSL через прокси-сервер SOCKS, при условии, что прокси-сервер может установить соединение с целевым сервером. Проблема, с которой вы столкнулись, заключается в том, что ваш прокси-сервер не может установить это соединение, которое не имеет ничего общего с Indy или SSL. Проблема на стороне прокси, а не в вашем приложении. Попробуйте отправить HTTP/HTTPS-запросы на другие домены, чтобы проверить, правильно ли работает прокси. - person Remy Lebeau; 10.10.2013