在 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.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中运行。 你能解决这个问题吗?我面临着完全相同的行为。 【参考方案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 CDI beans.xml

如何更新jboss EAP -6.2中的JSP / JS而无需重新启动或重新部署构建

动态配置 JBOSS ( eap 6.2 ) 数据源

JBoss EAP 6.2:war-file 的交换 auth-method

Jboss EAP 7 - REST API客户端的动态SSL身份验证