【问题标题】:SSL handshaking problem in webservice with Java and Tomcat使用 Java 和 Tomcat 的 web 服务中的 SSL 握手问题
【发布时间】:2011-02-16 02:07:21
【问题描述】:

我必须使用我的 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);

【问题讨论】:

    标签: java web-services https handshake


    【解决方案1】:
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我会试试这个并告诉你。我曾尝试导出 DER 格式的 X509 文件并将其导入“cacerts”,但没有成功。
      【解决方案4】:

      可能缺少正确的 SSL 认证。阅读这篇博文:http://blogs.oracle.com/andreas/entry/no_more_unable_to_find 这里给出的程序帮助了我一次。

      【讨论】:

      • 我已经尝试过这种方法,当我第二次执行InstallCerts时,它再次抛出异常。如果我查看 jssecerts 存储,证书是存在的。
      猜你喜欢
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 2018-07-11
      • 1970-01-01
      • 2014-06-28
      • 2019-04-24
      • 2016-03-02
      相关资源
      最近更新 更多