【发布时间】: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