我必须使用我的 Java Web 应用程序(在 Tomcat 上运行)使用在 Axis 中完成的 Web 服务。制作 Web 服务的公司使用 HTTPS 和自签名证书进行测试。
我已经运行了一个 Netbeans 向导来生成一个基于 WSDL 的 Web 服务,并且这样做是正确的。如果我使用浏览器进入 web 服务的网站,我会因为 SSL 证书而收到警告,我必须创建一个异常。
尝试运行我的代码时,在建立 SSL 连接时出现异常。例外情况是:
1.
com.sun.xml.ws.client.ClientTransportException:HTTP 传输错误:javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure
有时(不更改代码)
2.
com.sun.xml.ws.client.ClientTransportException:HTTP 传输错误:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到到请求目标的有效认证路径
我想我必须将证书合并到 Java VM 和/或 Tomcat 中,并且还告诉忽略它不是受信任的来源。
这个怎么做?如何正确使用这个安全的网络服务?
如果我提供的信息还不够,请询问更多。
谢谢
以西结
更新:
这两件事我都试过了,都没有成功,例外都是一样的。
选项1)
System.setProperty("javax.net.ssl.trustStore","/home/serverapp/BSS-cert.p12");
System.setProperty("javax.net.ssl.trustStorePassword","password");
System.setProperty("javax.net.ssl.trustStoreType","PKCS12");
选项 2) KeyStore ks = KeyStore.getInstance("pkcs12"); ks.load(new FileInputStream("/home/serverapp/BSS-cert.p12"), "password".toCharArray());
KeyStore jks = KeyStore.getInstance( "JKS" );
jks.load( null );
KeyManagerFactory kmf = KeyManagerFactory.getInstance( "SunX509" );
kmf.init( ks, "f0p6k9n2".toCharArray() );
TrustManagerFactory tmf = TrustManagerFactory.getInstance( "SunX509" );
tmf.init( jks );
SSLContext ctx = SSLContext.getInstance( "TLS" );
ctx.init( kmf.getKeyManagers(), tmf.getTrustManagers(), null );
此外,由于我认为问题可能出在 Web 服务上,因此我尝试建立 HTTPS 连接,但在打开输入流时它失败并出现同样的错误。
String httpsURL = "https://serverurl:443/theservice?wsdl";
URL myurl = new URL(httpsURL);
HttpsURLConnection con = (HttpsURLConnection)myurl.openConnection();
InputStream ins = con.getInputStream(); //Exception here!
InputStreamReader isr = new InputStreamReader(ins);
BufferedReader in = new BufferedReader(isr);