【发布时间】:2014-03-07 20:52:28
【问题描述】:
我有以下场景:两个 Java 应用程序在同一个 Tomcat 服务器上运行——我们称它们为 App A 和 App B——它们需要通过已经在 App 上运行的 web 服务相互通信A. 此 Web 服务仅接受经过身份验证的客户端 (clientAuth="true")。
全部配置好后,我的Tomcat作为客户端,发送一个空的证书链给服务器(就是同一个Tomcat)。这就是我所做的。
我使用 keytool 为服务器生成了一个自签名证书:
keytool -genkeypair -keyalg RSA -keysize 2048 -keystore keystore.jks -alias server
然后导出这个证书:
keytool -exportcert -keystore keystore.jsk -alias server -file server.crt
并将其添加到信任库:
keytool -importcert -keystore truststore.jsk -alias server -file server.crt
SSL协商如下:
- 客户打招呼
- 服务器打招呼并出示其证书(上面生成) 客户
- 客户端接受它(因为它在信任库中)
- 服务器通过提供有效 DN 列表(其中包含单个条目,即上面生成的证书)来要求客户端证书
- 客户端以某种方式确定它没有有效的证书并发送一个空的证书链
- SSL 握手失败
我没有发布实际的 SSL 日志,因为客户端和服务器是同一个 Tomcat,所以一切都是一团糟。
我在这里做错了什么?请记住,这两个应用程序位于同一台服务器上,并且证书是自签名的。我还做了一个测试,我生成了另一个自签名证书,将其导出到一个 .p12 文件并安装在我的浏览器中,然后通过 URL 直接在地址框中调用 Web 服务,它运行良好。
谢谢!
【问题讨论】:
-
问题不在于密钥,而在于您如何初始化 App B 使用的 HTTPS 连接/Web 服务客户端。
-
@Robert 我使用 wsimport 命令生成的存根,它使用 WSDL url(以“https”开头并使用端口 8443,正确配置)。在我的代码中,我使用了这个:
MyWebService service = new MyWebService(url); IMyWebService client = service.getMyWebServicePort(); client.myMethod(...);MyWebService 这个类扩展了 javax.xml.ws.Service。
标签: java web-services tomcat ssl https