web-services - 使用 Apache CXF 生成的类访问 Web 服务时出现 WebServiceException

标签 web-services ssl cxf

我在使用 Apache CXF 生成的类 (wsdl2java) 访问 Web 服务时遇到问题。

一切正常,直到网络服务提供商突然更改了他们防火墙上的规则并关闭了我们。他们说的是他们不再允许 http 流量,我们必须开始使用 https。有趣的是,直到现在我们还认为我们使用的是 https。这是继承的遗留代码。但我们几乎是逐字逐句地使用 Apache CXF 网站上的 ssl 示例。

这是 wsdl 的一部分:

...
<wsdl:portType name="GetMessagesSoap">
  <wsdl:operation name="GetInfo">
    <wsdl:input message="tns:GetInfoSoapIn" />
    <wsdl:output message="tns:GetInfoSoapOut" />
  </wsdl:operation>
</wsdl:portType>

...

<wsdl:service name="GetMessages">
  <wsdl:port name="GetMessagesSoap" binding="tns:GetMessagesSoap">
    <soap:address location="http://127.0.0.1/GetMessages.asmx" />
  </wsdl:port>
</wsdl:service>

基本上我们使用 wsdl2java 生成所有 Java 类。然后在我们的网关类中,我们执行以下操作:

private GetMessagesSoap getInstance() {
  GetMessages getMessages = new GetMessages(wsdlUrl);
  GetMessagesSoap getMessagesSoap = getMessages.getMessagesSoap();
  setupTransportLayerSecurity(getMessagesSoap);
}

private void setupTransportLayerSecurity(final Object port) {

  HTTPConduit httpConduit =
        (HTTPConduit) ClientProxy.getClient(port).getConduit();
  TLSClientParameters tlsCP = new TLSClientParameters();

  KeyStore keyStore = ...
  KeyManager[] myKeyManagers = getKeyManagers(keyStore ...
  tlsCP.setKeyManagers(myKeyManagers);
  KeyStore trustStore = ...
  TrustManager[] myTrustStoreKeyManagers = getTrustManagers(trustStore);
  tlsCP.setTrustManagers(myTrustStoreKeyManagers);
  tlsCP.setDisableCNCheck(true);
  tlsCP.setSecureSocketProtocol("SSL");

  httpConduit.setTlsClientParameters(tlsCP);
}

然后我们调用 getInfo()。这就是错误发生的地方。

public void getInfo() {
  GetMessagesSoap getMessagesSoap = getInstance();
  InfoResponse response = getMessagesSoap.getInfo()
}

我们得到的错误是相当普遍的:

  javax.xml.ws.WebServiceException: Could not send Message.

ws 提供者说它失败了,因为我们正在尝试使用 http 进入。尽管我们在 setupTransportLayerSecurity() 方法中做了所有花哨的 SSL 事情,但所有这一切。

我对这一切的根本怀疑是,这真的是它失败的原因吗?我的意思是,当规则从防火墙中删除时,它显然开始失败。但是,我不明白的是,如果 wsdl 中的 GetMessages 服务中的 url 是 http,即使我说使用 SSL,它到底怎么会使用 https?

我们在网络上放置了一个嗅探器,果然它只使用了 http。但是……这不是很正常吗??显然,我绝不是 SOAP 专家。有人可以阐明这个问题吗?

最佳答案

本地址 url 以 https 开头时,CXF HttpConduit 仅使用 TlsClientParameters。 您可以更改 WSDL 文件吗? 如果没有,你可以change service url at the runtime .

关于web-services - 使用 Apache CXF 生成的类访问 Web 服务时出现 WebServiceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20290506/

相关文章:

java - 如何使用 Alfresco Web 服务进行 Alfresco

php - 动态添加自定义输入字段并将其保存到数据库

ssl - 如何将 Cloudflare SSL 与 Hostinger 结合使用

java - Spring Boot + JAX-WS 无需额外的 servlet?

java - 黑莓检查 Facebook 集成权限

java - CXF 冲突 xmlschema 和 xmlschema-core 依赖

ssl - 与子进程共享 SSL 套接字

用于本地 HTTPS 的 Docker WSL2 SSL 证书

java - 将响应 header 添加到 JAX-RS Web 服务

java - 基于 cxf 的客户端中的 cacerts 与 jks