当前位置: 首页 > 知识库问答 >
问题:

迁移到CXF 3.2.7->如何解决SOAP RQ处理过程中与密码相关的安全错误?

申屠瀚海
2023-03-14

上下文:我试图将Web服务从CXF 2.2.2迁移到CXF 3.2.7

问题:每当我试图通过SOAP UI之类的软件对我的Web服务发出以下基于HTTP-Post SOAP的请求时,都会进行后期迁移:

<SOAP-ENV:Header>
      <wsse:Security SOAP-ENV:mustUnderstand="1">
        <wsse:UsernameToken wsu:Id="">
        <wsse:Username>sampleUser</wsse:Username>
        <wsse:Password>12345</wsse:Password>
        <wsse:PartnerID>samplePartner</wsse:PartnerID>
</wsse:UsernameToken>
</wsse:Security>
    <wsa:To>http://localhost:8080/sampleWs</wsa:To>
    <wsa:Action>http://localhost:8080/sampleWs/sampleAction</wsa:Action>
      <wsa:From>
      <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
</wsa:From>
</SOAP-ENV:Header>

我从CXF安全模块收到以下安全异常:

18:11:29,250 WARNING [org.apache.cxf.phase.PhaseInterceptorChain] (http-127.0.0.1:8080-1) Interceptor for {http://ws.sampleWs.varun/}SampleWebService has thrown exception, unwinding now: org.apache.cxf.binding.soap.SoapFault: A security error was encountered when verifying the message
        at org.apache.cxf.ws.security.wss4j.WSS4JUtils.createSoapFault(WSS4JUtils.java:234) [cxf-rt-ws-security-3.2.7.jar:3.2.7]
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessageInternal(WSS4JInInterceptor.java:341) [cxf-rt-ws-security-3.2.7.jar:3.2.7]
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:176) [cxf-rt-ws-security-3.2.7.jar:3.2.7]
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:87) [cxf-rt-ws-security-3.2.7.jar:3.2.7]
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) [cxf-core-3.2.7.jar:3.2.7]
        at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) [cxf-core-3.2.7.jar:3.2.7]
        .
        .
        .
Caused by: org.apache.wss4j.common.ext.WSSecurityException: BSP:R4201: Any PASSWORD MUST specify a Type attribute
        at org.apache.wss4j.common.bsp.BSPEnforcer.handleBSPRule(BSPEnforcer.java:57) [wss4j-ws-security-common-2.2.2.jar:2.2.2]
        at org.apache.wss4j.dom.message.token.UsernameToken.checkBSPCompliance(UsernameToken.java:834) [wss4j-ws-security-dom-2.2.2.jar:2.2.2]
        at org.apache.wss4j.dom.message.token.UsernameToken.<init>(UsernameToken.java:143) [wss4j-ws-security-dom-2.2.2.jar:2.2.2]
        at org.apache.wss4j.dom.processor.UsernameTokenProcessor.handleUsernameToken(UsernameTokenProcessor.java:137) [wss4j-ws-security-dom-2.2.2.jar:2.2.2]
        at org.apache.wss4j.dom.processor.UsernameTokenProcessor.handleToken(UsernameTokenProcessor.java:62) [wss4j-ws-security-dom-2.2.2.jar:2.2.2]
        at org.apache.wss4j.dom.engine.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:340) [wss4j-ws-security-dom-2.2.2.jar:2.2.2]
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessageInternal(WSS4JInInterceptor.java:285) [cxf-rt-ws-security-3.2.7.jar:3.2.7]
        ... 28 more

根本原因似乎是wsse:密码标签中缺少一个属性。

我检查了安全WS规范:http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd

在那里,我找不到最新的CXF所期望的wsse:password的强制类型属性。

注意:CXF 2.2.2版可以很好地处理相同的请求

问题:有没有办法防止CXF放弃上述请求并允许其通过。我到处找了很多,但找不到任何答案?有什么建议吗?或者修改SOAP请求是唯一的解决方案

共有2个答案

东门楚
2023-03-14

我也面临同样的问题,并发现soap请求中存在问题。

我可以通过添加以下内容来解决此问题:

  • 肥皂中的以下属性:Envelopexmlns: wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
  • wsse中的以下属性:PasswordType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"

我请求的标题如下所示

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tic="http://ticket.degroupage.atos.ma/"  xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
   <soapenv:Header>
      <wsse:Security soapenv:mustUnderstand="1">
         <wsse:UsernameToken><wsse:Username>XXXX</wsse:Username>
         <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">XXXX</wsse:Password>
         </wsse:UsernameToken>
     </wsse:Security></soapenv:Header>
   <soapenv:Body>
...
艾敏学
2023-03-14

正如@GPI之前所述,由于CXF试图强制执行基本安全规范中的R4201,上述请求被删除(http://www.ws-i.org/profiles/basicsecurityprofile-1.1.html).

为了防止CXF强制执行,我们可以使用由ws-Securitywss4j提供的配置常量来指示CXF停止强制执行。

解决方案#1(使用WSS4J拦截器)

在您的Spring配置文件中,您可以将isBspCompliant设置为false

    <jaxws:inInterceptors>
        <bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
            <constructor-arg>
                <map>
                    <entry key="action" value="UsernameToken" />
                    <entry key="passwordType" value="PasswordText" />
                    <entry key="passwordCallbackRef">
                        <ref bean="passwordCallback" />
                    </entry>
                    <entry key="isBSPCompliant" value="false"/>
                </map>
            </constructor-arg>
        </bean>
    </jaxws:inInterceptors>

解决方案#2(使用JAX-WS)

在spring配置文件中,可以设置ws-security。bsp是否符合到错误:

    <jaxws:endpoint id="sample" implementor="sample.ws.SampleWebService" address="/SampleWebService">
    <jaxws:properties> 
    <entry key="ws-security.is-bsp-compliant" value="false"/> 
    </jaxws:properties> 
</jaxws:endpoint>

有关其他配置选项,您可以参考以下页面:

http://ws.apache.org/wss4j/config.html

http://cxf.apache.org/docs/ws-securitypolicy.html

 类似资料:
  • 问题内容: 我正在加密用于登录的密码,它可以正常工作,但是我在Google Play控制台中收到一条警告,该如何删除它? 我正在android studio上尝试。 问题答案: 主要问题是您使用的密码没有完整性,并且使用了硬编码的加密密钥。如果使用“ 查找安全性错误”来分析源,则会收到CIPHER_INTEGRITY和HARD_CODE_KEY警告: 解决方案是使用包含基于哈希的消息认证码(HMA

  • 如果有人能给出有关迁移到Null-Safety的说明,那就太好了。

  • 对我的java项目执行sonarQube分析时引发以下错误:

  • 这是通过使用包含以下内容的SQL转储移植旧项目来学习Laravel(特别是v5.x)的一种尝试: 在垃圾堆的底部有一个与此特定表格相关的: 来自一对stackoverflow问题1、2、3;我修改了原始代码,将Schema::table的外键从Schema::create中拆分出来,并将unsigned()添加到每个字段: 但在使用新创建的空DB进行迁移时,仍然会出现错误: 根据MySQL,这意味

  • 我有一个spring boot 1.5.9授权服务器,它使用BCrypt存储密码。我正在尝试迁移到2.0,但是,我不再能够检索授权令牌。 服务器的响应是: 控制台输出以下内容:。 这部分应用程序以前工作得很好。我所做的唯一更改是build.gradle文件(更改、添加插件和添加。 中的密码哈希逻辑可在两个单独的配置文件中找到: 而且 OAuthUser类: 我知道spring的安全有很大的变化,但

  • 我正在尝试将我的应用程序服务器(JBOSS EAP)从6.4迁移到7.4.3。但是,迁移后,我在访问我的网络服务时收到以下错误。 立即展开:org。阿帕奇。cxf。拦截器。错误:解组错误:意外元素(uri:…)原因:com。太阳istack。SAXParseException2;行号:0;列数:0;意外元素(uri:…) 同样的请求在JBOSS EAP 6.4中运行得非常好。但在迁移之后,它现在不