Как я могу настроить 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
для имени хоста прокси-сервера SOCKSsocksProxyPort
для номера порта, значением по умолчанию является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");
и работает нормально.