2011-11-05 79 views
1

我成功构建了一个可用的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有自己的服务器可以在这些端口上启动?它似乎是后者,但这对我来说并没有什么意义。

回答

2

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

+0

是的,就是这样!我将transportReceiver条目更改为使用AxisServletListener,并解决了端口问题。谢谢! –

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"); 
0

一种方式连接到HTTPS使用JAX-WS

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

这将WSDL文件夹下生成封装结构。用它。

现在,您只需将信任库存放在run.bat或使用System类来设置属性。

它会正常工作。