通过SSL保护Tomcat / Axis2 Web服务时遇到问题

时间:2011-11-05 20:43:01

标签: java web-services tomcat ssl axis2

我已经成功构建了一个有效的Web服务,客户端和.jsp驱动的UI。我使用Eclipse,Axis2,Tomcat 7和Java 7完成了这项工作。

基本流程是用户访问.jsp并提交带有输入数据的表单。 JSP将“请求”对象转发到Java客户端。 Java客户端使用Web服务并提交用户输入。该服务通过JDBC连接到SQL Server数据库以检索信息,该信息将显示回用户。

这一切都完全适用于HTTP,但现在我想保护这个过程,这就是我遇到问题的地方。我能够创建一个证书并让Tomcat使用它。我可以通过HTTPS连接到Web UI并提交表单并将数据恢复正常。问题是这只能保证前端的安全。 Web服务客户端代码仍然在后台通过HTTP连接到服务。

根据this page,我真正需要做的就是通过SSL启用我的连接服务是更新axis2.xml文件并为HTTPS添加一个新的“transportReceiver”节点。我这样做并重新生成我的客户端代码以使用安全端点。它不起作用。

我已将Tomcat配置为侦听端口8081的http和8443的https。但是在更改axis2.xml以匹配并启动Tomcat之后,我得到以下内容:

  

[INFO]侦听端口8443 [ERROR]终止连接   倾听者   org.apache.axis2.transport.http.server.DefaultConnectionListener@16d60567   在0秒后重复10次。 java.net.BindException:地址已经   使用中:JVM_Bind at java.net.DualStackPlainSocketImpl.bind0(Native   方法)在java.net.DualStackPlainSocketImpl.socketBind(未知   来自)java.net.AbstractPlainSocketImpl.bind(未知来源)at   java.net.PlainSocketImpl.bind(未知来源)at   java.net.ServerSocket.bind(未知来源)at   java.net.ServerSocket。(未知来源)at   java.net.ServerSocket。(未知来源)at   org.apache.axis2.transport.http.server.DefaultConnectionListener.run(DefaultConnectionListener.java:80)   at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)   at java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source)   在java.lang.Thread.run(未知来源)

我尝试更改axis2.xml中的端口号(例如,更改为8445),这种方式有效。服务器能够干净利落地启动,但最终会出现相同的错误。例如,当我检索WSDL时,我通过控制台看到错误(虽然WSDL确实显示)。此外,如果我尝试在端口8445上实际使用该服务,我会收到以下错误:

  

org.apache.axis2.AxisFault:连接已关闭:   javax.net.ssl.SSLException:无法识别的SSL消息,明文   连接?

我只能假设这是因为Tomcat配置为在8443上处理HTTPS,而不是8445,但老实说我不知道​​。

如果我将端口保留为8443并忽略启动时的错误,我在连接服务时会收到以下消息:

  

org.apache.axis2.AxisFault:连接已关闭:   javax.net.ssl.SSLHandshakeException:   sun.security.validator.ValidatorException:PKIX路径构建失败:   sun.security.provider.certpath.SunCertPathBuilderException:无法   找到所请求目标的有效证书路径

我跟着these steps尝试让它识别我的证书,但是当它导入我的JRE7密钥库时,我得到以下内容:

  

keytool error:java.lang.Exception:证书回复和证书   在密钥库中是相同的

基本上,该证书已经存在。这是有道理的,因为它是Tomcat已经成功使用的那个。

所以,我现在很无能为力。我真的不确定我应该做什么。任何一般性指导,或逐步操作的链接都会非常有用。

但对于一个特定的问题......当我在axis2.xml中设置transportReceiver节点时,我到底做了什么?我告诉它Tomcat运行的端口和应该使用的端口,或者Axis2是否有自己的服务器将在这些端口上启动?它似乎是后者,但这对我来说并没有多大意义。

3 个答案:

答案 0 :(得分:2)

Axis2 documentation中描述了配置servlet传输的正确方法。您描述的症状表明您有一个引用org.apache.axis2.transport.http.SimpleHTTPServer的transportReceiver。另请确保使用最新版本的Axis2(1.5.6或1.6.1)。

答案 1 :(得分:0)

请参阅Andreas对端口问题的回应。至于证书问题,我对密钥库和信任库之间的区别存在误解。 JVM默认使用JAVA_HOME \ lib \ security \ cacerts作为其信任库,而不是USER_HOME \ .keystore文件。一旦我在那里导入证书,错误便消失了。

我还能够通过代码将表明信任存储设置为密钥存储文件来解决证书问题。我在将证书导入cacerts商店之前就这样做了。它在调用服务之前进入客户端代码:

System.setProperty("javax.net.ssl.trustStore","C:\\path\\to\\.keystore");
System.setProperty("javax.net.ssl.trustStorePassword","password");

答案 2 :(得分:0)

连接到HTTPS的一种方法是使用jax-ws

E:\WSDL>wsimport -keep -p com.mypack.webservice https://domain:port/ws/MyService?wsdl

这将在wsdl文件夹下生成包结构。使用它。

现在你所要做的就是将信任存储放在run.bat或使用System类来设置属性。

它会正常工作。