【发布时间】:2015-05-14 19:52:00
【问题描述】:
总结:我有一个通过 HTTPS 调用远程 Web 服务的 SAAJ 客户端。需要通过证书进行客户端和服务器身份验证。在 IDE 中运行 JUnit 测试时可以成功调用服务,但在 JBoss 中运行时无法连接。
Keystore/Truststore 配置详细信息:在 IDE 和 JBoss 中,我通过系统属性设置密钥库和信任库:javax.net.ssl.keyStore、javax.net.ssl.keyStorePassword、javax.net.ssl.trustStore、javax.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.xml、jbossws-cxf.xml 或 cxf.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中运行。
-
你能解决这个问题吗?我面临着完全相同的行为。