Проверка Подлинности Прокси-Сервера На Java
у меня есть Java webapp, работающий в Tomcat 6, который загружает RSS-каналы с удаленных URL-адресов.
Я использую Рим для обработки RSS-каналов и различных форматов для меня. Часть соединения выглядит так:
try{
feedSource = new URL(rssObject.getAsset());
}catch(MalformedURLException mue){
logger.error(...);
throw mue;
}
try{
URLConnection connection = feedSource.openConnection();
feed = new SyndFeedInput().build(new XmlReader(connection));
}catch(Exception){handle...}
этот код работает нормально, за исключением нового клиента, где они используют прокси.
чтобы использовать прокси, я устанавливаю http.свойства системы proxyHost и proxyPort:
System.setProperty("http.proxyHost", proxyHost);
System.setProperty("http.proxyPort", proxyPort);
System.setProperty("https.proxyHost", proxyHost);
System.setProperty("https.proxyPort", proxyPort);
HTTP GET сделан к прокси хорошо, но теперь я получаю ошибку HTTP 502 (плохой шлюз или что-то подобное).
анализируя обмен HTTP с Wireshark, я заметил, что прокси требует аутентификации. Он отправляет HTTP 507. Java каким-то образом пытается аутентифицироваться, но использует неправильное имя пользователя и пароли. Кажется, он использует имя хоста в качестве имени пользователя, а пароль я не знаю.
поэтому я попытался реализовать метод Authenticator для указания имени пользователя+пароля :
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
logger.info(MessageFormat.format("Generating PasswordAuthentitcation for proxy authentication, using username={0} and password={1}.", username, password));
return new PasswordAuthentication(username, password.toCharArray());
}
});
Теперь моя проблема в том, что она игнорируется. Метод getPasswordAuthentication никогда не вызывается. Я не вижу оператора logging в файле журнала и с помощью Wireshark я вижу, что он все еще использует имя хоста в качестве имени пользователя.
почему ? Кажется, что java каким-то образом пытается аутентифицировать себя без консультации с аутентификатором.
прокси-кажется МС устройство, использующее для проверки подлинности NTLM. Есть ли какой-то встроенный механизм в java справиться с этим ? Машина, на которой работает приложение, - это Win Server 2008 R2.
1 ответов
мы же здесь для проверки подлинности по протоколу NTLM прокси.
аутентификация на прокси-сервере на самом деле является нормальной базовая аутентификация http.
мы использовали следующий метод:
protected URLConnection newURLConnection(URL pURL) throws IOException {
URLConnection urlConnection = super.newURLConnection(pURL);
String auth = new String(Base64.base64Encode(new String("username:password").getBytes()));
auth = "Basic " + auth;
urlConnection.setRequestProperty("Proxy-Connection","Keep-Alive");
urlConnection.setRequestProperty("Proxy-Authorization",auth);
return urlConnection;
}
это вместе с настройками прокси jvm сделало трюк.
см.http://en.wikipedia.org/wiki/Basic_access_authentication.