【问题标题】:Version service error with clean Axis2 install on Tomcat在 Tomcat 上安装干净的 Axis2 时出现版本服务错误
【发布时间】:2011-11-03 19:50:15
【问题描述】:

我是一名正在实习的工科学生。我必须创建一个 Web 服务。它必须:

  • 使用 HTTPS
  • 使用 Gzip 压缩 HTTPS 数据
  • 使用 SOAP/WSDL

我以前从未开发过网络服务。我选择了 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:找不到有效的证书路径到请求的目标

我该如何解决这个问题?

【问题讨论】:

    标签: tomcat ssl axis2


    【解决方案1】:

    您收到此信息是因为您用于保护axis2 服务的证书不受信任。您需要将该公共证书或将其签名的 CA 证书导入密钥存储并设置以下两个系统属性 - 在您的客户端代码中

    System.setProperty("javax.net.ssl.trustStore", "path/to/keystore");
    System.setProperty("javax.net.ssl.trustStorePassword", "keystore_password");
    

    【讨论】:

    • 感谢您的帮助。但是现在我不使用客户端,我尝试配置 tomcat+axis+ssl,目前我没有创建 webservice 应用程序。
    【解决方案2】:

    参考链接: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>
    

    【讨论】:

      【解决方案3】:

      版本服务错误很常见,我在全新安装axis2和tomcat时也遇到了完全相同的问题。

      无论如何,要修复版本服务错误,打开axis2-web/HappyAxis.jsp,找到以下代码行:

      OMNamespace omNs = fac.createOMNamespace("http://axisversion.sample/xsd", "ns1");
      

      将上面一行修改为:

      OMNamespace omNs = fac.createOMNamespace("http://axisversion.sample", "ns1");
      

      【讨论】:

        【解决方案4】:

        首先,问题几乎可以肯定是您用来保护 Tomcat 的证书没有由标准 CA 签名。这可能会花费很多,但实际上并不多,它使客户工作得更好。如果您在客户端证书模式下使用 SSL(不是默认模式,但很容易打开),那么您还必须配置 Tomcat 以了解客户端证书的签名者(或多个签名者)——好吧,除非他们使用标准 CA。

        如果我这样解释可能会更容易。当 SSL(或 HTTPS)连接的一端使用加密证书来证明他们是谁时——服务器总是这样做,并且可以要求客户端也这样做——另一端得到一整包签名关于它是谁的断言,但仍需要独立检查这些断言是否正确。这是通过检查谁签署了断言(以及其他一些事情)来完成的;如果它是由受信任的人(即证书颁发机构)签名的,那么加密身份的接收者可以知道他们真正在与谁交谈。

        不过,这过于简单化了:证书过期,存在使用限制,可能存在信任链,对于 HTTPS,还有额外的检查。然而,最终这一切都归结为“我在和谁说话,我真的信任他们吗?”密码学对此有很大帮助,但这确实意味着需要信任根。默认情况下,需要信任根(或根)的是客户端,但对于经过客户端身份验证的 SSL,它是双方的。

        【讨论】:

        • 另外,真的有必要使用Axis吗?那里有更好的 Java 网络服务引擎实现......
        猜你喜欢
        • 2013-08-27
        • 2011-02-25
        • 2012-02-13
        • 2023-03-17
        • 1970-01-01
        • 2017-02-02
        • 1970-01-01
        • 2012-01-12
        • 1970-01-01
        相关资源
        最近更新 更多