2011-12-29 23 views
6

Tengo una aplicación web Java, que se ejecuta en Tomcat 6, que carga las fuentes RSS desde URL remotas.Autenticación Proxy Java

Uso Rome para manejar las fuentes RSS y los diferentes formatos para mí. La pieza de conexión se parece así:

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...} 

el código funciona bien, excepto a este nuevo cliente, en el que usan un proxy.

Para utilizar el proxy, que establezca las http.proxyHost y proxyPort propiedades del sistema:

System.setProperty("http.proxyHost", proxyHost); 
System.setProperty("http.proxyPort", proxyPort); 
System.setProperty("https.proxyHost", proxyHost); 
System.setProperty("https.proxyPort", proxyPort); 

se hace con el proxy HTTP GET bien, pero ahora me sale un error HTTP 502 (puerta de enlace o mala algo parecido).

Al analizar el intercambio HTTP con Wireshark, noté que el proxy requiere autenticación. Envía un HTTP 507. Java intenta de alguna forma autenticarse, pero usa el nombre de usuario y las contraseñas incorrectos. Parece utilizar el nombre de host como nombre de usuario, en cuanto a la contraseña que no conozco.

así que traté de poner en práctica el método de autenticador de especificar un nombre de usuario + contraseña:

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()); 
      } 
     }); 

Ahora mi problema es que es ignorado. El método getPasswordAuthentication nunca se llama. No veo la declaración de registro en el archivo de registro y el uso de Wireshark puedo ver que todavía utiliza el nombre de host como nombre de usuario.

¿Por qué? Parece que Java de alguna manera intenta autenticarse por sí mismo sin consultar el Authenticator.

El proxy parece ser un dispositivo MS que usa NTLM para la autenticación. ¿Hay algún mecanismo incorporado en Java para manejar esto? La máquina en la que se ejecuta la aplicación es Win Server 2008 R2.

Respuesta

12

Hicimos lo mismo aquí para autenticar en un proxy basado en NTLM.

La autenticación en el proxy es en realidad una autenticación básica HTTP normal.

Se utilizó el siguiente método:

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; 
} 

Eso, junto con la configuración del proxy de JVM, resolvieron el problema.

Ver http://en.wikipedia.org/wiki/Basic_access_authentication.

+0

Muchas gracias. funciona para nosotros también. –

Cuestiones relacionadas