【问题标题】:Web service not working on GlassFish serverWeb 服务无法在 GlassFish 服务器上运行
【发布时间】:2011-11-04 11:55:05
【问题描述】:

我在 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();      
}

【问题讨论】:

  • 检查 glassfish 中的 domain.xml 文件中的 ssl 参数。
  • 感谢 Zaki 的回复。我已经在 domain.xml 中提供的路径中安装了证书。即使我尝试从 domain.xml 更改 glassfish 密钥库和信任库路径(通过提供绝对路径尝试)。请告诉我我还应该寻找什么。
  • 服务器的证书是自签名的吗?查看 $GF_HOME/glassfish/domains/your_domain/logs 中的 server.log 文件以获取完整的异常详细信息,否则很难缩小范围。
  • Zaki,我在日志文件夹中没有看到任何日志。我是玻璃鱼的新手。如何启用玻璃鱼日志??
  • 经过大量挖掘,我找到了unknown_ca错误背后的原因。实际上,glass fish 提供了一些其他证书作为受信任的证书。所以我已经从 glassfish 密钥库中删除了所有证书并安装了我的证书。现在部署应用程序后,我得到“javax.net.ssl.SSLHandshakeException: sun.security。 validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径”异常。我已经在 glass fish trust store 和 keystore.pls 中安装了证书。

标签: java web-services ssl


【解决方案1】:

您使用的开发环境是什么?如果您使用的是 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 的常见原因),您可以在客户端 Web 服务中做一个解决方法以用于开发/测试目的:

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;
         }
     });
}

目前我没有看到您的问题的根源,但我认为您应该解决这些问题。

【讨论】:

    【解决方案2】:

    您还需要指定以下 JVM 选项:

    -Dcom.sun.enterprise.security.httpsOutboundKeyAlias=[alias of the client certificate in your keystore]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2015-11-11
      相关资源
      最近更新 更多