1

我是 Web 服务的新手,我需要编写简单的 spring-ws 客户端,它将通过 SSL 与服务器通信。情况是:

  • 我的客户端在我的 Glassfish 上的 localhost ws 服务器上与 http 配合良好(问题是远程服务器和 https)
  • 远程服务器正常工作。我将只使用它发送给我的数据
  • 我有服务器的 https 地址
  • 我有来自服务器提供商的客户端证书

我认为为此类任务找到一个简单的教程会很容易,但我很难找到类似的东西。这真的很不寻常还是我有问题?你知道一些很好的教程/书来创建这个吗?这可能是一些简单的快速步骤,我真的只需要连接到该服务器并从中获取数据。

我在用:

编辑:有关该主题的更多详细信息

我将客户端从我提到的教程更改为使用我在本地主机上创建的 Web 服务(无 SSL)。它运作良好,请求和响应是正确的。然后我将其更改为与远程服务器一起使用。我生成了新类并在 ApplicationContext 中设置了服务器的新地址。第一个错误是缺少公共日志库。我添加了它。然后出现了新错误(该错误的简短版本):

org.springframework.ws.client.WebServiceIOException: I/O error: java.security.cert.CertificateException: No name matching certificatename found; nested exception is javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching certificatename found

我使用 keytool 将我的证书添加到我的 jdk 中的 cacerts 中。它没有帮助。我发现了有关该错误的一些信息,并尝试在此处添加上一篇文章中的代码:

http://www.coderanch.com/t/557677/sockets/java/CertificateException-No-name-matching-hostname

它不应该很安全,但我试过了。新的错误是:

Exception in thread "main" org.springframework.ws.client.WebServiceTransportException: Internal Server Error [500]
at org.springframework.ws.client.core.WebServiceTemplate.handleError(WebServiceTemplate.java:663)
at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:587)
at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:537)
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:384)
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:378)
...
4

2 回答 2

1

我解决了这个问题。我终于可以访问我们的 WS 服务器,这样我就可以检查日志了。它表明证书根本没有问题。消息正确到达服务器。当服务器尝试解析我的消息时,问题就开始了,这失败了,然后服务器返回错误 500 并在日志中显示错误:

无法从给定来源创建信封

我和我的同事发现服务器在 Java 6 上运行,但我们的应用程序在 Java 7 上,我们尝试将应用程序移动到 Java 7 私有服务器上,一切正常。经过一番搜索,我们发现解析器 xalan.jar 和 xerces.jar 可能是问题所在,更新它们也可以解决这个问题。无论如何,使用相同版本的 Java 应该是解决方案。

可悲的是,我不能降到 Java 6,服务器不能升到 Java 7(细节不重要)。所以我使用 Axis 创建了全新的客户端,老实说,我很高兴我做出了这个决定。它从一开始就有效,而且使用起来更容易。如果有人感兴趣,这是我遵循的教程(还有我需要的最后如何使用生成的代码)

http://px.pats.no/px/Eclipse_tutorial.html

于 2013-02-05T16:59:16.100 回答
0

此问题与您的证书中未包含的 dns 名称有关,要解决此问题,请尝试重新制作您的证书:

keytool ... san=ip:10.1.1.1

或者只是尝试添加一个静态方法,告诉 java 不要验证域:

 static{
javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
new javax.net.ssl.HostnameVerifier(){

    public boolean verify(String dns,
            javax.net.ssl.SSLSession sslSession) {
        return true;
    }
});

}

于 2014-08-12T08:51:54.940 回答