繁体   English   中英

具有证书的Spring-WS客户端

[英]Spring-WS client with certificate

我是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)
...

我解决了这个问题。 我终于可以访问我们的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

此问题与您尚未包含在证书中的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;
    }
});

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM