Как настроить HTTPClient для аутентификации через прокси-сервер SOCKS?
-
21-09-2019 - |
Вопрос
Мне нужно настроить аутентификацию прокси-сервера на прокси-сервере 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
для имени хоста прокси-сервера 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, аутентификация прокси).
Вы можете предоставить собственную фабрику сокетов, реализующую протокол SOCKS, и зарегистрировать ее в качестве обработчика протокола HTTP по умолчанию.Это решение имеет ограничение, аналогичное ответу Tuergeist выше, — оно применяется глобально, к любому HTTP-соединению, которое вы устанавливаете через HttpClient.
Если вы считаете это проблемой, взгляните на эта переписка, где Олег предлагает использовать HttpClient 4.0, но также ссылается на возможный патч в классе HostConfiguration для HttpClient 3.x.
Другое возможное решение, которое мне больше всего нравится, — это написать HTTP-прокси-обертку для прокси-сервера Socks.
Я пытался
System.setProperty("socksProxyHost", "socks.xyz.com");
System.setProperty("socksProxyPort", "1000");
и он работает нормально.