【发布时间】:2011-06-07 05:48:05
【问题描述】:
我正在尝试从需要客户端提供客户端证书的 Web 服务请求数据。服务器使用 SSL 进行所有通信,并使用自签名证书。我为 Netbeans 提供了服务的 WSDL 文件,它生成了带有 wsimport 的客户端代码。
当我的客户端代码是在常规 Java 应用程序中编写时,我没有任何问题;我将信任库设置为包含服务器证书的cacerts 文件,将密钥库设置为服务器管理员以 JKS 格式提供的文件,其中包含 2 个密钥 - 客户端私钥和服务器公钥,构建请求对象,然后发送请求。
当我将它转移到企业 Java 环境时,问题就来了。要求规定代码必须是在 Glassfish 应用服务器上运行的 Enterprise Archive 中的 Enterprise JavaBean。 Glassfish 似乎有自己的安全设置,可以覆盖 JVM 的设置。当包含 Web 服务调用的 EJB 方法运行时,SSL 协商失败:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target。我不知道如何像我的 JVM 设置一样设置 Glassfish 的安全设置,谁能解释 Glassfish 的安全设置?我所做的研究只展示了如何将 Glassfish 设置为 Web 服务 服务器,而不是 Web 服务 客户端。
我有一个服务器的 .cer 证书文件,我使用 Java 的 keytool 将它添加到我的信任库中,将其添加到默认的 cacerts 文件中。
按照http://blog.johnryding.com/post/1548502059/acquire-an-ssl-certificate-for-your-java-programs-in-win 的步骤,用InstallCert 修改cacerts 文件以包含自签名证书会更好吗?
我有信任存储文件、密钥存储文件以及 .cer 证书文件和 .p12 浏览器证书,存储在 $JAVA_HOME/jre/lib/security 和 $JAVA_HOME/lib/security 中。
我正在使用 Netbeans 6.9.1 和 Glassfish 3.1 Final。下面是相关的代码,从我的 EJB 复制而来。异常发生在最后一行。
System.setProperty("javax.net.ssl.trustStore", "C:\\jssecacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
System.setProperty("javax.net.ssl.keyStore", "C:\\userCertificate.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "password");
RequestObject request = new RequestObject;
request.setQuery("some data");
request.setUsername("user");
request.setPassword("pass");
Service service = new Service();
Endpoint port = service.getWebServicePort();
Result result = port.specificWebServiceMethod(request);
【问题讨论】:
-
问题解决了吗??我也面临同样的情况。如果您有任何事情,请提供详细信息。
标签: authentication ssl jakarta-ee glassfish ejb