我成功构建了一个可用的Web服务,客户端和.jsp驱动的用户界面。我使用Eclipse,Axis2,Tomcat 7和Java 7完成了这项工作。通过SSL保护Tomcat/Axis2 Web服务的问题
基本流程是用户访问.jsp并使用输入数据提交表单。 JSP将“请求”对象转发给Java客户端。 Java客户端使用Web服务并提交用户输入。该服务通过JDBC连接到SQL Server数据库以检索显示回用户的信息。
这一切都完美通过HTTP,但现在我想确保过程,这是我遇到问题的地方。我能够创建一个证书并让Tomcat使用它。我可以通过HTTPS连接到Web用户界面并提交表单并将数据恢复正常。问题是这只能保证前端的安全。 Web服务客户端代码仍然通过HTTP在后台连接到服务。
根据this page,我真正需要做的是通过SSL为我的服务启用连接,即更新axis2.xml文件并为HTTPS包含一个新的“transportReceiver”节点。我这样做,并重新生成我的客户端代码以使用安全端点。它不起作用。
我已配置Tomcat以监听端口8081的http和8443的https。但改变axis2.xml匹配,并启动Tomcat的后,我得到如下:
[INFO] Listening on port 8443 [ERROR] Terminating connection listener o[email protected]16d60567 after 10retries in 0 seconds. java.net.BindException: Address already in use: JVM_Bind at java.net.DualStackPlainSocketImpl.bind0(Native Method) at java.net.DualStackPlainSocketImpl.socketBind(Unknown Source) at java.net.AbstractPlainSocketImpl.bind(Unknown Source) at java.net.PlainSocketImpl.bind(Unknown Source) at java.net.ServerSocket.bind(Unknown Source) at java.net.ServerSocket.(Unknown Source) at java.net.ServerSocket.(Unknown Source) 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) at java.lang.Thread.run(Unknown Source)
我试图改变在axis2.xml的端口号(例如,8445),以及诸如此类的作品。服务器能够干净地启动,但最终会出现相同的错误。例如,当我检索WSDL时,通过控制台看到错误(虽然WSDL确实显示)。另外,如果我尝试实际使用服务时,在端口8445,我得到以下错误:
org.apache.axis2.AxisFault: Connection has been shutdown: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
我只能假设这是因为Tomcat的配置来处理HTTPS的8443,不是8445,但老实说,我不知道。
如果我离开端口8443,而忽略在启动时的错误,我得到以下信息,当我连接到服务:
org.apache.axis2.AxisFault: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
我跟着these steps设法得到它认识到我的证书,但它导入到我的JRE7密钥库时,我得到如下:
keytool error: java.lang.Exception: Certificate reply and certificate in keystore are identical
基本上,证书已经存在。这是有道理的,因为它是Tomcat已经成功使用的一个。
所以,我在这一点上很无知。我真的不确定我应该做什么。任何一般的指导或者一步一步的指导方法都是非常有用的。
但是,对于一个具体的问题......当我在axis2.xml中设置transportReceiver节点时,我到底在做什么?我是否告诉它Tomcat正在运行的端口以及它应该使用的端口,还是Axis2有自己的服务器可以在这些端口上启动?它似乎是后者,但这对我来说并没有什么意义。
是的,就是这样!我将transportReceiver条目更改为使用AxisServletListener,并解决了端口问题。谢谢! –