Java : HTTP(S)/WebServices connexions par proxy NTLM

Nous avons un client java côté application déployée dans nos client (une application java, pas une applet).
Cette application vérifie la connectivité avec une url.openConnection() et les appels de services web (avec CXF/JAX-WS) par le biais d'internet.

Certains de nos clients l'utilisation d'un réseau de procurations pour l'accès au monde extérieur.
Côté client, l'application définit le paramètre de proxy dans les propriétés système java :

System.setProperty("proxySet", "true");   //Obsolete ?
System.setProperty("http.keepAlive", "false");
System.setProperty("java.net.useSystemProxies", "false");
System.setProperty("https.proxyHost", httpsProxyHost);
System.setProperty("https.proxyPort", httpsProxyPort);
System.setProperty("https.proxyUser", httpsProxyUser);
System.setProperty("https.proxyPassword", httpsProxyPassword);
System.setProperty("http.proxyHost", httpProxyHost);
System.setProperty("http.proxyPort", httpProxyPort);
System.setProperty("http.proxyUser", httpProxyUser);
System.setProperty("http.proxyPassword", httpProxyPassword);

Authenticator.setDefault(new NtlmAuthenticator(httpsProxyUser, httpsProxyPassword));

La NtlmAuthenticator classe :

public class NtlmAuthenticator extends Authenticator {

private final String username;
private final char[] password;

public NtlmAuthenticator(final String username, final String password) {
    super();
    this.username = username;
    this.password = password.toCharArray(); 
}

public PasswordAuthentication getPasswordAuthentication() {
    return (new PasswordAuthentication (username, password));
}

}

Nous sommes à l'aide de Java 6 (côté client demande de jouer un JRE 1.6.0_39), et l'application est déployée sur Windows (XP /Seven). J'ai lu que le protocole NTLM est pris en charge depuis 1.4.2 sur la plateforme Windows.
Nous avons donc fait des tests avec une Tendance de proxy et de réussir à effectuer l'authentification du proxy NTLM (nous voyons les 3 paquets avec Wireshark NTLMSSP_NEGOCIATE (à partir de l'app) /NTLMSSP_CHALLENGE (à partir de proxy) /NTLMSSP_AUTH (à partir de l'app))

Mais avec l'un de nos clients, qui utilisent un Bluecoat proxy, authentification NTLM après l'échec de NTLMSSP_CHALLENGE. Avec Wireshark, on ne voit que les 2 premiers paquets NTLMSSP_NEGOCIATE (à partir de l'app) et NTLMSSP_CHALLENGE (à partir de proxy), NTLMSSP_AUTH n'est jamais envoyé par notre application.
Dans cette application, on attraper une exception socketexception : socket est fermée

Nous avons également essayer d'utiliser jCIFS HttpUrlNltmHandler, mais échec de l'authentification trop (même diagnostic).

J'ai trouvé ce fil avec un problème similaire, mais il ne fournit pas d'indices.
J'ai trouvé aussi cette fil sur la sécurité de session NTLM

Des idées ?

Grâce.

Trouver la solution par la mise en http.keepalive de vrai :
Système.setProperty("http".keepAlive", "vrai");

Mais je ne sais pas pourquoi, avec de la fausse valeur, il travaille avec notre Tendance proxy ne fonctionne pas avec nos clients bluecoat proxy

OriginalL'auteur Nicolas A. | 2013-07-08