2009-08-25 4 views
11

웹 서비스에 액세스해야하는 Java 응용 프로그램 (애플릿이 아님)이 있습니다. 웹 서비스를위한 프록시는 JAX-WS로 생성되었으며 제대로 작동하는 것 같습니다. 한 시나리오에서 NTLM 인증을 요구하도록 설정된 웹 프록시 서버 (실제로는 Squid 3.0)를 통해 대화해야합니다.Java 6 NTLM 프록시 인증 및 HTTPS - 누구나 작동하도록합니까?

Sun의 JRE 1.6.0_14에서 실행하면 변경 사항없이 HTTP URL에 액세스 할 수 있습니다. 기본 제공 NTLM 인증자가 실행되고 모든 것이 아무렇게나 작동합니다. 그러나, 웹 서비스 URL이 HTTPS URL이 경우, 웹 서비스 호출은 썬의 코드 내부에 깊은 실패 : 같은 클래스에서 몇 가지 예외를 전환 일의 버그 데이터베이스에서 찾고

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 

, 그러나 그들의 모든 것 수정되었습니다. 아무도 이런 걸 보지 못했습니까? 누구든지이 일을 할 수 있니?

+0

수입품도 함께 제공하십시오. – itro

답변

4

당신은 JAX-WS와 결혼 했습니까? 저는 Commons httpclient를 사용하고 NTLM 인증을 내장 한 Apache Axis2를 사용합니다.

예 : 디버깅 후에

//Configure SOAP HTTP client to authenticate to server using NTLM 
HttpTransportProperties.Authenticator auth = new HttpTransportProperties.Authenticator(); 

//TODO make report server credentials configurable 
auth.setUsername("jdoe"); 
auth.setPassword("strongpass"); 
auth.setDomain("WINDOWSDOMAIN"); 
auth.setHost("host.mydomain.com"); 
auth.setPort(443); 

Options o = new Options(); 
o.setProperty(org.apache.axis2.transport.http.HTTPConstants.AUTHENTICATE,auth); 
myWebServiceStub._getServiceClient().setOptions(o); 
+2

프로젝트가 JAX-WS를 추출하고 무언가로 바꾸는 것에 익숙해지기 엔 너무 가까운 릴리스이지만, 제안에 감사드립니다. – DavidK

10

이 구체적 sun.net.www.protocol.http.HttpURLConnection에서 JRE 클래스 라이브러리에 결함이있을 것으로 보인다.

HTTP 및 HTTPS 끝점의 경우 HTTP 요청과 응답을 연구 한 결과 성공적인 HTTP의 경우 요청에 실패한 HTTPS 경우에 누락 된 Proxy-Connection=keep-alive 헤더가 있음을 보여줍니다. 좀 더 일반적으로, "Proxy-Connection"또는 "Connection"을 사용해야하는지 여부에 약간의 혼란이있는 것 같습니다.

어쨌든 HTTP의 경우 코드는 HttpURLConnection.writeRequests() 다음 코드를 포함하고있는이 오징어는 NTLM 인증 대화 중에 흥분됩니다 HTTPS에 대한 프록시를 통해 터널을 만들 때

/* 
    * For HTTP/1.1 the default behavior is to keep connections alive. 
    * However, we may be talking to a 1.0 server so we should set 
    * keep-alive just in case, except if we have encountered an error 
    * or if keep alive is disabled via a system property 
    */ 

    // Try keep-alive only on first attempt 
    if (!failedOnce && http.getHttpKeepAliveSet()) { 
    if (http.usingProxy) { 
     requests.setIfNotSet("Proxy-Connection", "keep-alive"); 
    } else { 
     requests.setIfNotSet("Connection", "keep-alive"); 
    } 

그런 코드가 없습니다 니펫을.

난 그냥

내가 주입
setPreemptiveProxyAuthentication(requests); 
http.writeRequests(requests, null); 

전에

if (http.getHttpKeepAliveSet()) { 
    if (http.usingProxy) { 
     requests.setIfNotSet("Proxy-Connection", "keep-alive"); 
    } 
} 

을 추가 HttpURLConnection.sendCONNECTRequest()에서,이 문제를 해결하려면 내 이제 "-Xbootclasspath/P"플래그를 사용하여 JRE에 HttpURLConnection.class 및 수정 그것은 작동합니다! 정확하게 우아하지는 않지만 거기에 있습니다.

+1

동일한 문제가 있습니다. 나는 정확히 같은 문제를 설명하는 JDK 버그를 발견했다 : http://bugs.sun.com/view_bug.do?bug_id=6206466 이상하게도, 다른 버그는 꽤 다르긴하지만 이상하게도 중복/수정으로 표시되었다. – sereda

+2

예, 때로는 Sun의 버그 데이터베이스로 인해 웃고 울기를 원하는지 모르겠습니다. 아마도 래리 엘리슨이 버그를 일으키거나 버그가 실제로 중복되는지 여부를 확인하지 않으면 너무 바빠서 걱정할 수도 있습니다 ... – DavidK

+1

BigZig도 수입품을 제공해 주시겠습니까? – itro