我是Web服务的新手,我需要编写简单的spring-ws客户端,它将通过SSL与服务器通信。情况是:
我认为为这样的任务找到一个简单的教程会很容易但我找到类似的东西有问题。这真的很不寻常,还是我的问题?你知道一些很好的教程/书吗?这可能是一些简单的快速步骤,我真的只需要连接到该服务器并从中获取数据。
我正在使用:
编辑:有关该主题的更多详情
我将客户端从我提到的教程更改为使用我在localhost上创建的webservice(无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)
...
答案 0 :(得分:1)
我解决了这个问题。我终于可以访问我们的WS服务器,所以我可以查看日志。它表明证书根本不是问题。消息正确到达服务器。当服务器尝试解析我的消息时,问题就开始了,这个失败了,然后服务器返回错误500并在日志中出错:
无法从指定来源
创建信封
我和我的同事发现服务器在Java 6上运行但我们的应用程序在Java 7上,我们试图在Java 7私有服务器上移动我们的应用程序,一切运行良好。经过一些搜索,我们发现解析器xalan.jar和xerces.jar可能是问题,更新它们也可以解决这个问题。无论如何,使用相同版本的Java应该是解决方案。
遗憾的是,我无法进入Java 6,服务器也无法进入Java 7(细节并不重要)。所以我使用Axis创建了全新的客户端,说实话,我很高兴我做出了这个决定。它从一开始就有效,而且使用起来更容易。如果有人有兴趣,这里是我的教程(还有如何使用生成的代码到底我需要)
答案 1 :(得分: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;
}
});
}