Как настроить HTTPClient для аутентификации через прокси-сервер SOCKS?

StackOverflow https://stackoverflow.com/questions/1388822

Вопрос

Мне нужно настроить аутентификацию прокси-сервера на прокси-сервере 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);

Будет ли это работать с НОСКИ прокси тоже или мне нужно сделать что-то другое?

Это было полезно?

Решение

А Страница функций 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, аутентификация прокси).

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

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

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

Я пытался

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top