我是一名实习的工科学生。我必须创建一个Web服务。它必须:
我之前从未开发过Web服务。我选择了Tomcat + Axis来开发这个项目。
我的操作系统是Windows 7,我安装了Tomcat 6.0并配置了HTTPS,当我尝试使用浏览器访问Tomcat时,它运行正常。我还为Gzip压缩配置了服务器。
接下来,我尝试安装Axis,因此我下载了axis1.5.4.war
并将其部署在服务器上。通过我的浏览器,我能够成功访问Axis“欢迎页面”,但当我点击“验证”时,我得到了这个:
Axis2版本服务出现问题,可能是服务不可用或有些事情出错了。但这并不意味着系统无法正常工作!尝试上传其他服务并检查它是否正常工作。 [原文如此]
为解决此问题,我按照this documentation修改了服务器上的Axis conf
文件。
我在Eclipse控制台上得到了这个:
[INFO]无法将viaPost发送到url [https:// localhost / axis2 / services / Version] org.apache.axis2.AxisFault:连接已关闭:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到有效的证书路径要求目标
如何解决此问题?
答案 0 :(得分:1)
首先,问题几乎可以肯定,用于保护Tomcat的证书未由标准CA签名。这可能会花费,但实际上并不多,它使客户工作得更好。如果您在客户端证书模式下使用SSL(不是默认模式,但很容易打开),那么还必须配置Tomcat以了解客户端证书的签名者(或签名者) - 以及,除非他们使用标准CA.
如果我以这种方式解释它也许会更容易。当SSL(或HTTPS)连接的一端使用加密证书来证明他们是谁时 - 服务器始终执行此操作,并且可以请求客户端也这样做 - 另一端获得一整套签名关于它是谁的断言,但仍需要独立检查那些断言是否属实。这是通过检查签署断言的人(以及其他一些东西)来完成的;如果它是由受信任的人签署的,即证书颁发机构,则加密身份的接收者可以知道他们正在与谁交谈。
虽然过于简单化了:证书过期,存在使用限制,可能存在信任链,而对于HTTPS,还有额外的检查。然而,最终它必须归结为“我与谁交谈,我真的相信它们吗?”密码学对此有很大帮助,但这确实意味着需要信任根。默认情况下,它是需要信任根(或根)的客户端,但使用经过客户端验证的SSL,它是双方的。
答案 1 :(得分:1)
版本服务错误非常常见,我在全新安装的axis2&上遇到了完全相同的问题。 tomcat也是。
Anways,要修复版本服务错误,请打开axis2-web / HappyAxis.jsp并找到以下代码行:
OMNamespace omNs = fac.createOMNamespace("http://axisversion.sample/xsd", "ns1");
将以上行修改为以下内容:
OMNamespace omNs = fac.createOMNamespace("http://axisversion.sample", "ns1");
答案 2 :(得分:0)
您得到此信息是因为您用于保护axis2服务的证书不受信任。您需要将该公共证书或签署它的CA证书导入密钥库并设置以下两个系统属性 - 在您的客户端代码中
System.setProperty("javax.net.ssl.trustStore", "path/to/keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "keystore_password");
答案 3 :(得分:0)
参考链接:http://axis.apache.org/axis2/java/core/docs/servlet-transport.html
对于每个协议(HTTP和/或HTTPS),必须在axis2.xml中声明AxisServletListener实例。如果仅使用单个协议,则不需要进一步配置。例如,如果仅使用HTTP,则axis2.xml中必须存在以下声明:
<transportReceiver name="http" class="org.apache.axis2.transport.http.AxisServletListener"/>
如果同时使用HTTP和HTTPS,那么事情会变得有点复杂。原因是为了公开具有正确端点URI的WSDL,AxisServlet必须知道HTTP和HTTPS使用的端口。遗憾的是,servlet API不允许Web应用程序发现所有已配置的协议。它仅提供有关当前请求的协议,主机名和端口的信息。如果只配置了一个AxisServletListener,则此信息足以让AxisServlet自动检测端口号。如果同时使用HTTP和HTTPS(或者通过AxisServlet以外的传输检索WSDL),则AxisServlet无法知道端口号,直到它为每个协议处理了至少一个请求。要在此方案中使WSDL生成可预测,有必要在axis2.xml中显式配置端口号,如下例所示:
<transportReceiver name="http" class="org.apache.axis2.transport.http.AxisServletListener">
<parameter name="port">80</parameter>
</transportReceiver>
<transportReceiver name="https" class="org.apache.axis2.transport.http.AxisServletListener">
<parameter name="port">443</parameter>
</transportReceiver>