在 JBoss EAP 6.2 中无法通过 SSL 连接到 SOAP 服务
Posted
技术标签:
【中文标题】在 JBoss EAP 6.2 中无法通过 SSL 连接到 SOAP 服务【英文标题】:Unable to connect to SOAP Service over SSL in JBoss EAP 6.2 【发布时间】: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中运行。 你能解决这个问题吗?我面临着完全相同的行为。 【参考方案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 中的任何配置文件。以上是关于在 JBoss EAP 6.2 中无法通过 SSL 连接到 SOAP 服务的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JBoss EAP 6.2 中使用 ManagementRealm 保护 Web 应用程序?
如何更新jboss EAP -6.2中的JSP / JS而无需重新启动或重新部署构建