Glassfish无法使用SSL Web服务

时间:2014-10-02 10:30:08

标签: ssl glassfish webservice-client

我有一个简单的Java应用程序,它使用Web服务。 Web服务使用.p12文件作为密钥库:

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

我还有一个调用.JAR中的函数的.jsp文件:

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

我已经在Tomcat中部署了应用程序并且工作正常(WSTest65.test使用Web服务并将结果写入stdout),但在GlassFish中,我收到以下错误:

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

为什么这在Tomcat而不是在GlassFish中有效?

祝你好运 斯蒂芬

1 个答案:

答案 0 :(得分:1)

我曾经遇到类似的问题,这是由于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;
}

}