java - Web 服务无法在 GlassFish 服务器上运行

标签 java web-services ssl

我用 Java 创建了一个 Web 服务,它将数据发布到另一个 Web 服务。这需要 SSL 证书进行身份验证。此 Web 服务在 Tomcat 上运行良好,但当我在 GlassFish 3.0.1 服务器上部署相同的代码时,我收到 javax.net.ssl.SSLHandshakeException: Received fatal alert: unknown ca exception。 我已使用 keytool 将证书导入到 glassfish trustStore。所需证书由客户提供。

我的代码:

System.setProperty("javax.net.ssl.keyStoreType" , "pkcs12");
System.setProperty("javax.net.ssl.keyStore", applicationRootDirPath + "clientCert.p12");
System.setProperty("javax.net.ssl.keyStorePassword", "password");

System.setProperty("javax.net.ssl.trustStoreType", "jks");
System.setProperty("javax.net.ssl.trustStore", "path of glass fish truststore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

try {
    url = new URL(serverUrl);
    urlConn =  url.openConnection();
    urlConn.setDoOutput(true);
    urlConn.setRequestMethod("POST");
    urlConn.setAllowUserInteraction(false);
    urlConn.setUseCaches(false);
    urlConn.setRequestProperty("Content-type", "text/xml; charset=utf-8");
    urlConn.setRequestProperty("Content-Length", new Integer(xml.length()).toString());

    try {
        writer = new OutputStreamWriter(urlConn.getOutputStream(), "UTF-8");
        writer.write(xmlData);
    } finally {
        if (writer != null) {
            writer.close();
        }
    }
    trace += "\n urlConn.getInputStream()";
    in = urlConn.getInputStream();      
}

最佳答案

您使用的开发环境是什么?如果您使用的是 NetBeans,则必须在 /etc/netbeans.conf 的 VMargs 中设置这些(这是正确的 Web 服务工具功能所必需的,以便您可以生成客户端):

<NETBEANS_HOME>/bin/netbeans.exe
-J-Djavax.net.ssl.trustStore=<AS_HOME>/domains/domain1/config/cacerts.jks 
-J-Djavax.net.ssl.keyStore=<AS_HOME>/domains/domain1/config/keystore.jks 
-J-Djavax.net.ssl.trustStorePassword=changeit 
-J-Djavax.net.ssl.keyStorePassword=changeit

此外,请确保您已在 GlassFish 中正确设置信任库;将这些行完全像这样添加到 JVM 选项中:

-Djavax.net.ssl.trustStore=${truststore.location}
-Djavax.net.ssl.trustStorePassword=${ssl.password}

此外,如果它不是有效证书(例如主机名不匹配,这是 javax.net.ssl.SSLHandshakeException 的常见原因),您可以在客户端网络中执行解决方法用于开发/测试目的的服务:

static {
     //WORKAROUND. TO BE REMOVED.
     javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
     new javax.net.ssl.HostnameVerifier(){
         public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
                if (hostname.equals("mytargethostname")) { //Change to actual value
                     return true;
                }
                return false;
         }
     });
}

目前我看不出你的问题的根源,但我认为这些是你应该解决的问题。

关于java - Web 服务无法在 GlassFish 服务器上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8008840/

相关文章:

c# - 为什么我们不能在非泛型类中拥有泛型方法?

java - Spring 将多部分附件读取为输入流

java - JAX-WS - 将异常映射到故障

php - SSL 仅适用于网站的一半

java - 枚举值的构造顺序

java - 如何在 Java 中序列化 AttributedString?

security - 如何为 Artifactory 4.x 支持 TLS

c# - 在 Visual Studio 的 UnitTest 中解析服务器 SSL 证书时出现奇怪的问题

java - 前向 header 可变 Spring Boot

node.js - Node -RED + DB2 - 消息 : string[18] "No response object"