2011-02-16 129 views
1

我必须使用我的Java Web应用程序(在Tomcat上运行)来使用Axis中完成的web服务。做web服务的公司使用HTTPS和自签名的测试证书。使用Java和Tomcat的webservice中的SSL握手问题

我已经运行Netbeans wizzard来生成基于WSDL的Web服务,并且这是正确的。如果我使用浏览器进入web服务的网站,由于SSL证书,我收到警告,我必须创建一个例外。

当试图运行我的代码时,SSL连接发生时会出现异常。唯一的例外是:

1.

com.sun.xml.ws.client.ClientTransportException: HTTP transport error: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

一些时间(不改变代码)

2.

com.sun.xml.ws.client.ClientTransportException: HTTP transport error: 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

我想,我一定要结合证书导入Java VM和/或Tomcat,并且还告诉忽略这不是可信的来源。

如何做到这一点?如何正确使用这个安全的web服务?

如果我提供的信息不够,请询问更多。

感谢

埃塞基耶尔

UPDATE:

我已经试过这两个东西,都没有成功,唯一的例外是相同的。

项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) 密钥库KS = KeyStore.getInstance( “PKCS12”); (新的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); 

回答

0

我认为你必须配置,可以信任未签名的证书。也许this会帮助你。

0

为了信任证书,您必须告诉java您相信签署证书的证书颁发机构。如果是自签证书,那就是证书本身。您需要将javax.net.ssl.trustStore系统属性设置为包含您要连接的服务器证书的CA的密钥库。

当您获取证书以通过不可信的连接错误时,您可能能够从浏览器获取证书。尝试找到一个选项以PKCS12格式导出证书,并保存该文件。在运行代码时,将javax.net.ssl.trustStore属性设置为刚刚保存的文件,并将javax.net.ssl.trustStoreType设置为PKCS12。

+0

我会尝试这一点,并让你知道。我试图导出DER格式化的X509文件并将其导入“cacerts”,但它不起作用。 – Ezequiel 2011-02-16 07:06:23

+0

我试过这两件事。 – Ezequiel 2011-02-16 08:12:58