2014-10-02 107 views
0

我有一個簡單的Java應用程序使用Web服務。 Web服務使用.p12文件的密鑰庫:Glassfish無法使用SSL Web服務

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

我也有一個調用的.JAR功能的.jsp文件:我已經部署在Tomcat和它的應用

<%@ 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> 

工作正常(WSTest65.test消耗的web服務,並將結果寫入stdout),但在GlassFish中,我得到以下錯誤:

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

任何建議,爲什麼這個工程在Tomcat中,而不是在GlassFish中?

問候 斯特凡

回答

1

我曾經有一個類似的問題,這是由不beeing有效Glassfish的客戶端證書造成的。

Glassfish似乎在連接期間將其客戶端SSL證書發送到服務器。如果其他服務器配置爲驗證此證書,則連接可能不會建立。

對我來說,解決方案是用一個空的密鑰庫提供調用,覆蓋配置目錄中的密鑰庫。也許你可以做同樣的事情,但不要使用空的密鑰庫,而要使用自己的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.sun.xml.wss.jaxws.impl] [tid:_ThreadID = 32 _ThreadName = http-listener-1(6)] [timeMillis:1412840535990] [levelValue:1000] [[0124] [] com.sun.xml.wss.XWSSecurityException:安全性未滿足要求 - 消息中沒有安全標頭 WSSTUBE0025:驗證入站消息中的安全性時出錯。 – StefanOfDenmark 2014-10-09 08:35:52

+0

對不起。我無法格式化評論? – StefanOfDenmark 2014-10-09 08:41:24