2014-10-02 108 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