使用相互SSL将Glassfish配置为Web服务的客户端

Jac*_*ard 4 authentication ssl ejb glassfish java-ee

我正在尝试从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-中的步骤,修改包含自签名证书的cacerts文件会更好吗?双赢InstallCert

我有信任存储文件,密钥存储文件,以及.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);

Dcc*_*cBr 5

我遇到了雅克普里查德描述的同样的例外情况:

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
Run Code Online (Sandbox Code Playgroud)

解决了它使用以下命令在cacerts.jks和keystore.jks中导入根证书:

/usr/java/jdk1.6.0_25/bin/keytool -import -trustcacerts -file root_ca.cer -alias rootca -keystore cacerts.jks

/usr/java/jdk1.6.0_25/bin/keytool -import -trustcacerts -file root_ca.cer -alias rootca -keystore keystore.jks
Run Code Online (Sandbox Code Playgroud)

重要的是要说别名rootca是我自己定义的名称来标记证书.您也可以选择任何名称.