Как я могу настроить HTTPClient для аутентификации на SOCKS прокси?

Мне нужно настроить прокси-аутентификацию на SOCKS-прокси. Я обнаружил этот пост с инструкциями, которые работают с обычными HTTP прокси.

        httpclient.getHostConfiguration().setProxy("proxyserver.example.com", 8080);

        HttpState state = new HttpState();
        state.setProxyCredentials(new AuthScope("proxyserver.example.com", 8080), 
           new UsernamePasswordCredentials("username", "password"));
        httpclient.setState(state);

Будет ли это работать с SOCKS- прокси, или мне придется делать что-то другое?

5 ответов

Решение

На странице возможностей Apache HTTPClient написано:

Прозрачные соединения через прокси-серверы SOCKS (версии 4 и 5) с использованием встроенной поддержки сокетов Java.

С "прозрачным", я думаю, они имеют в виду, что он работает без необходимости делать что-то особенное. У вас есть SOCKS прокси где-нибудь? Не могли бы вы просто попробовать, чтобы увидеть, работает ли это?

Java поддерживает настройку прокси Socks через настройки:

  • socksProxyHost для имени хоста прокси-сервера SOCKS
  • socksProxyPort для номера порта, значением по умолчанию является 1080

например

java -DsocksProxyHost=socks.mydomain.com

(отредактируйте) Например, если прокси-сервер socks был настроен так, как описано выше:

httpclient.getHostConfiguration().setProxy("proxyserver.example.com", 8080);
Credentials cred = new UsernamePasswordCredentials("username","password");
httpclient.getState().setProxyCredentials(AuthScope.ANY, cred); 

Вы также можете использовать этот вариант (без httpclient):

SocketAddress addr = new
InetSocketAddress("webcache.mydomain.com", 8080);
Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr); // Type.HTTP for HTTP

Итак, завершив предыдущий пример, теперь мы можем добавить:

URL url = new URL("http://java.sun.com/");
URConnection conn = url.openConnection(proxy);

НТН

SOCKS изначально не поддерживается HttpClient 3. Вы можете попробовать поддержку SOCKS в JDK, как предлагают другие. Побочным эффектом является то, что вся ваша JVM будет проходить через один и тот же прокси-сервер SOCKS.

Java 5 поддерживает аутентификацию имени пользователя / пароля в SOCKS (тип 2). Все, что вам нужно сделать, это настроить аутентификатор следующим образом:

Authenticator.setDefault(new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(username, password.toCharArray());
    }
});

Опять же, это может не сработать, потому что это влияет на всю аутентификацию в вашей JVM (HTTP-аутентификация, Proxy Auth).

Вы можете предоставить собственную фабрику сокетов, которая реализует протокол SOCKS, и зарегистрировать ее в качестве обработчика протокола HTTP по умолчанию. Это решение имеет ограничение, аналогичное приведенному выше ответу tuergeist - оно применяется глобально к любому HTTP-соединению, которое вы устанавливаете через HttpClient.

Если вы обнаружите, что это проблема, посмотрите на это соответствие, где Олег предлагает использовать HttpClient 4.0, но также ссылается на возможное исправление в классе HostConfiguration для HttpClient 3.x.

Другое возможное решение, которое мне больше всего нравится, - написать HTTP-прокси-оболочку для socks-прокси.

Я старался

System.setProperty("socksProxyHost", "socks.xyz.com");
System.setProperty("socksProxyPort", "1000");

и работает нормально.

Другие вопросы по тегам