【问题标题】:Unable to connect to SOAP Service over SSL in JBoss EAP 6.2在 JBoss EAP 6.2 中无法通过 SSL 连接到 SOAP 服务
【发布时间】:2015-05-14 19:52:00
【问题描述】:

总结:我有一个通过 HTTPS 调用远程 Web 服务的 SAAJ 客户端。需要通过证书进行客户端和服务器身份验证。在 IDE 中运行 JUnit 测试时可以成功调用服务,但在 JBoss 中运行时无法连接。

Keystore/Truststore 配置详细信息:在 IDE 和 JBoss 中,我通过系统属性设置密钥库和信任库:javax.net.ssl.keyStorejavax.net.ssl.keyStorePasswordjavax.net.ssl.trustStorejavax.net.ssl.trustStorePassword

日志配置:在 JBoss 中,我通过系统属性启用了 SSL 调试日志:javax.net.debug=SSL。我还通过 logging.properties 文件启用了 CXF 日志记录。

JBoss SSL 日志记录输出摘要

  • SSL 日志显示没有 WARN 或 ERROR 日志
  • SSL 日志显示在调用远程服务时已建立会话

JBoss CXF 日志输出总结

  • CXF 日志显示 POST 通过 Conduit null.http-conduit 发送到服务

  • CXF 日志显示此管道“配置为纯 http”,具有“无信任决策者”和“无身份验证供应商”(我不完全确定所有这些意味着什么,但听起来很相关)

堆栈跟踪:这是我得到的实际堆栈跟踪

    Caused by: javax.xml.soap.SOAPException: JBWS024004: SOAP message could not be sent
    at org.jboss.wsf.stack.cxf.saaj.SOAPConnectionImpl.call(SOAPConnectionImpl.java:124)
    at my.client.soap.MySAAJClient.invoke(MySAAJClient.java:37) [my-client-0.0.1-SNAPSHOT.jar:]
    ... 17 more
Caused by: org.apache.cxf.transport.http.HTTPException: HTTP response '403: Forbidden' when communicating with https://remote.service.url.here/
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1542)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1502)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1309)
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:627)
    at org.jboss.wsf.stack.cxf.saaj.SOAPConnectionImpl.call(SOAPConnectionImpl.java:120)
    ... 19 more

其他信息

  • 我无法直接访问远程 Web 服务的日志,但我被告知它们“不显示任何内容”
  • CXF 发挥作用是因为它被 JBoss 使用。我的项目中没有包含任何 CXF 依赖项,当我在 IDE 中运行代码时,它没有发挥作用。

我尝试过的事情:我一直专注于 CXF,因为在我的 IDE 中执行时,这一切都运行良好,其中 CXF 没有发挥作用,并且 CXF 日志显示管道有被“配置为普通 http”让我害怕。我尝试在我的 WAR 中包含一个 jboss-cxf.xmljbossws-cxf.xmlcxf.xml 配置文件,其中包括密钥库和信任库配置。这没有奏效,我什至无法判断 CXF 正在查看这些文件。

我的问题(更新)

  • 有什么方法可以让 JBoss/CXF 看到这是一个安全连接并使用通过系统属性配置的密钥库/信任库?
  • 我有什么方法可以指导 JBoss(也许是通过 jboss-deployment-structur.xml?)为我的部署使用不同的 SAAJ 实现?

  • 您对我应该研究的其他事情有什么想法吗?


更新 1

我相信我已经确认 JBoss-CXF 集成是问题所在。我能够通过修改文件 {JBOSS_HOME}/modules/system/layers/base/org/jboss/ws/saaj-impl/main/module.xml 来删除 JBoss 的 SOAPConnectionImpl。我注释掉了模块依赖<module name="org.jboss.ws.jaxws-client" services="import"/>

进行此更改后,我的应用程序能够毫无问题地连接到远程服务。

虽然这说明JBoss-CXF集成是这个问题,但是我不能这样修改部署环境。我需要找出另一种解决方案。

【问题讨论】:

  • 嘿,您是否尝试过使用 SOAPUI 来确保您可以访问该服务?
  • 是的。我可以从 SOAPUI 访问服务就好了。问题只存在于JBoss中运行。
  • 你能解决这个问题吗?我面临着完全相同的行为。

标签: java soap https jboss cxf


【解决方案1】:

我会选择系统属性(或至少知道系统的配置),因为它们可能会覆盖您在部署中指定的任何内容。

部署环境用的是什么版本的cxf?你有关于部署环境中 cxf 配置的任何信息吗?从文档 (http://cxf.apache.org/docs/ws-security.html) 中,我可以看到您需要为 cxf 2.0.x 或更早版本配置 WSS4J 拦截器,因此您可以检查这在您的部署环境中是否可以。

【讨论】:

  • 我已经确认系统属性是预期的。我相信这个版本的 JBoss 使用的是 CXF 2.7.7。我已经按照我能找到的所有不同的说明来提供 CXF 配置文件 - 没有运气。我熟悉 CXF tlsClientParameters 配置,但似乎无法让 JBoss/CXF 获取我包含在 WAR 中的任何配置文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
  • 2017-01-20
  • 2017-11-03
  • 1970-01-01
相关资源
最近更新 更多