2014-10-02 2 views
0

웹 서비스를 사용하는 간단한 Java 응용 프로그램이 있습니다.Glassfish는 SSL 웹 서비스를 사용할 수 없습니다.

<%@ page import="dk.jems.wsTest65.WSTest65" %> 
<html> 
    <head> 
    <title>Web service from NetBeans 6.5.1</title> 
    </head> 
    <body> 
    <div>Hello Web service</div> 
    <% WSTest65.test(); %> 
    </body> 
</html> 

내가 톰캣과의 응용 프로그램을 배포 한 :

System.setProperty("javax.net.ssl.keyStoreType", "pkcs12"); 
System.setProperty("javax.net.ssl.keyStore", "/certs/cert.p12"); 

나는 또한 .JAR에서 함수를 호출하는 .jsp로 파일이 : 웹 서비스는 키 스토어로 .P12 파일을 사용하여 미세 (WSTest65.test 웹 서비스를 소비하고 표준 출력에 결과를 기록한다)하지만, 글래스 피쉬에, 나는 다음과 같은 오류가 작동합니다

HTTP transport error: java.net.SocketException: Connection reset 

이 톰캣하지 글래스 피쉬에서 작동 왜 어떤 제안?

안부 스테판

답변

1

내가 한 번 그 유효한 beeing는하지 글래스 피시 클라이언트 인증서에 의해 발생 된, 비슷한 문제가 있었다.

Glassfish는 연결 중에 클라이언트 인증서를 서버에 보냅니다. 다른 서버가이 certs의 유효성을 검사하도록 구성되어 있으면 연결이 설정되지 않을 수도 있습니다.

나를위한 해결책은 비어있는 키 저장소를 호출하여 구성 디렉토리의 키 저장소를 덮어 쓰는 것입니다. 아마도 동일한 작업을 수행 할 수 있지만 비어있는 키 저장소를 사용하는 대신 자신의 p12 키 저장소를 사용할 수 있습니다.

또한 시스템 속성을 설정하는 것이 런타임 중에 glassfish에서 작동하지 않는다고 생각합니다.

난 당신

@RequestScoped 
public class WebserviceWrapper { 

private Port createAndPingWebservice() { 
    .... 
    SSLContext sslCtx = SSL_CONTEXT_WITHOUT_CLIENT_CERTS; 
    ctxt.put("com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory", sslCtx.getSocketFactory()); 
    ctxt.put("com.sun.xml.ws.transport.https.client.SSLSocketFactory", sslCtx.getSocketFactory()); 

    return port; 
} 

private static final SSLContext SSL_CONTEXT_WITHOUT_CLIENT_CERTS; 

static { 
    SSLContext sslCtx = null; 
    try { 
     sslCtx = SSLContext.getInstance("SSL"); 
     TrustManager[] trustManagers = new TrustManager[]{ 
      new X509TrustManager() { 
       @Override 
       public X509Certificate[] getAcceptedIssuers() { 
        return new X509Certificate[0]; 
       } 

       @Override 
       public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException { 
       } 

       @Override 
       public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException { 
       } 
      } 
     }; 

     KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
     KeyStore ks = KeyStore.getInstance("JKS"); 

     try (InputStream keyStoreIn = WebserviceWrapper.class.getResourceAsStream("emptyKeystore.jks")) { 
      ks.load(keyStoreIn, "changeit".toCharArray()); 
     } 
     kmf.init(ks, "changeit".toCharArray()); 

     sslCtx.init(kmf.getKeyManagers(), trustManagers, null); 

    } catch (NoSuchAlgorithmException | KeyStoreException | IOException | CertificateException | UnrecoverableKeyException | KeyManagementException e) { 
     Logger.getLogger(WebserviceWrapper.class.getName()).log(Level.SEVERE, null, e); 
    } 
    SSL_CONTEXT_WITHOUT_CLIENT_CERTS = sslCtx; 
} 

} 
+0

코드 주셔서 감사에 아마도 도움이 될 수있는, 몇 가지 코드를 첨부,하지만 난 그 방법을 시도했다. 런타임시 시스템 등록 정보가 정확하다고 생각하고 완전히 다른 결과를 얻은 httpsOutboundKeyAlias를 설정하려고했습니다. [com.unix.wss.jaxws.impl] [tid : _ThreadID = 32 _ThreadName = http-listener-1 (6)] [timeMillis : 1412840535990] [levelValue : 1000] [ WSSTUBE0025 : 인바운드 메시지의 보안 확인 오류. com.sun.xml.wss.XWSSecurityException : 보안 요구 사항이 충족되지 않았습니다. 메시지에 보안 헤더가 없습니다. WSSTUBE0025 : 인바운드 메시지의 보안 확인 오류. – StefanOfDenmark

+0

엉망으로 미안 해요. 코멘트를 포맷 할 수 없습니까? – StefanOfDenmark

관련 문제