Java 6 NTLM proxy d'authentification et de HTTPS - quelqu'un a réussi à le faire fonctionner?
J'ai une application Java (pas une applet) qui a besoin d'accéder à un service web. Les procurations pour le service web ont été générés avec JAX-WS, et semblent bien fonctionner. Dans un scénario, il a besoin de parler à travers un serveur proxy web (en fait Squid 3.0), qui est configuré pour exiger l'authentification NTLM.
En cours d'exécution sur Sun JRE 1.6.0_14, tout fonctionne bien pour l'accès à des Url HTTP, sans nécessiter des changements: le haut-NTLM authentificateur de coups de pied dans tout cela fonctionne sans faille. Si, toutefois, l'URL du service web est une URL HTTPS, le service web d'échec de l'appel profond à l'intérieur du Soleil code:
com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: java.lang.NullPointerException
at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:121)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:142)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:83)
at com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:105)
at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:587)
at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:546)
at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:531)
at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:428)
at com.sun.xml.internal.ws.client.Stub.process(Stub.java:211)
at com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:124)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:98)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
... our web service call ...
Caused by: java.lang.NullPointerException
at sun.net.www.protocol.http.NTLMAuthentication.setHeaders(NTLMAuthentication.java:175)
at sun.net.www.protocol.http.HttpURLConnection.doTunneling(HttpURLConnection.java:1487)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:164)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:896)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:109)
... 16 more
À la recherche à Soleil le bug de la base de données active jusqu'à quelques exceptions près, dans ces classes, mais tous semblent avoir été résolus. Quelqu'un a rencontré quelque chose comme ça? Quelqu'un a eu que cela fonctionne?
OriginalL'auteur DavidK | 2009-08-25
Vous devez vous connecter pour publier un commentaire.
Après un peu de débogage, ce qui semble être une faille dans la JRE de bibliothèques de classes, plus précisément dans
sun.net.www.protocol.http.HttpURLConnection
.Étudier les requêtes et réponses HTTP et dans le cas de HTTP et de HTTPS points de terminaison ont montré que, dans la réussite de HTTP cas, la demande a un en-tête
Proxy-Connection=keep-alive
, qui était manquant sur le défaut HTTPS cas. La lecture de façon plus générale, il semble y avoir une certaine confusion à savoir si l'on doit utiliser "Proxy-Connection" ou tout simplement "Connexion", trop ...De toute façon, il est à noter que dans le cas HTTP, le code passe par
HttpURLConnection.writeRequests()
, qui contient de l'extrait de code suivantIl n'y a pas de code lors de la création d'un tunnel à travers le proxy pour le protocole HTTPS, ce qui provoque le Calmar à se fâcher au cours de l'authentification NTLM conversation.
Pour contourner ce problème, dans
HttpURLConnection.sendCONNECTRequest()
, j'ai ajoutéjuste avant
J'injecte mon modifiée
HttpURLConnection.class
dans la JRE à l'aide de la "-Xbootclasspath/p" drapeau, et maintenant ça fonctionne! Pas exactement élégant, mais nous y sommes.Oui, parfois, je ne suis pas sûr si le Soleil est de la base de données de bogues me donne envie de rire ou de pleurer. Peut-être qu'ils sont trop occupés à se soucier de savoir si Larry Ellison va licencier ou de ne pas vérifier si les bugs sont vraiment doublons ...
BigZig pourriez vous s'il vous plaît fournir votre Importations de trop?
(Quelques années plus tard...) Il y a une référence à cette question dans un rapport de bug: bugs.java.com/view_bug.do?bug_id=6973030 il est marqué comme étant résolu depuis Java 7b109.
OriginalL'auteur DavidK
Êtes-vous marié à JAX-WS? J'utilise Apache Axis2, qui utilise les communes httpclient et a l'authentification NTLM.
Exemple:
OriginalL'auteur Zack Angelo