我试图从Web服务请求客户端提交客户端证书的数据。服务器使用SSL进行所有通信,并使用自签名证书。我向Netbeans提供了该服务的WSDL文件,并生成了带有wsimport
的客户端代码。将Glassfish配置为使用双向SSL的Web服务的客户端
当我的客户端代码写入常规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
文件中,将它添加到我的信任存储中。 如果将cacerts
文件修改为InstallCert
以包含自签名证书,请按照http://blog.johnryding.com/post/1548502059/acquire-an-ssl-certificate-for-your-java-programs-in-win的步骤更好地修改?
我有存储在$ JAVA_HOME/jre/lib/security和$ JAVA_HOME/lib/security中的信任存储文件,密钥存储文件以及.cer证书文件和.p12浏览器证书。
我使用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);
你解决了这个问题吗?我面对同样的情况。如果你有东西,请提供详细信息。 – mahesh 2011-11-18 11:43:12