Переход на CXF 3.2.7 - ›Как устранить ошибку безопасности, связанную с паролем, во время обработки SOAP RQ?

Контекст: я пытаюсь перенести веб-сервис с CXF 2.2.2 на CXF 3.2.7.

Проблема: публиковать миграцию всякий раз, когда я пытаюсь запустить следующий запрос на основе HTTP-POST SOAP к моему веб-сервису через такое программное обеспечение, как SOAP UI:

<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:password.

Я проверил спецификации безопасности WS: http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd

Там я не смог найти обязательный атрибут типа для wsse:passwordas, ожидаемого последней версией CXF.

Примечание: тот же запрос отлично обрабатывается CXF версии 2.2.2.

Вопрос: есть ли способ запретить CXF отбросить вышеуказанный запрос и позволить ему пройти. Я много оглядывался, но не нашел ответов? Какие-либо предложения ? ИЛИ изменение запроса SOAP - единственное решение?


person varunsinghal65    schedule 16.11.2018    source источник
comment
Не предлагая решения вашей проблемы, но упомянутый вами XSD ДЕЙСТВИТЕЛЬНО требует атрибута типа (wsse: Password имеет тип PasswordString, который расширяет AttributedString, имеющий обязательный тип). Более того, XSD - это просто перевод базового профиля требований ws-i.org /profiles/basicsecurityprofile-1.1.html правило R4201   -  person GPI    schedule 16.11.2018
comment
Спасибо за место! Простите меня за глупость, но вы говорите это потому, что minOccurs="0" отсутствует в AttributedString? Также, если это так, я все равно оставлю этот вопрос открытым, на случай, если у кого-то есть решение.   -  person varunsinghal65    schedule 16.11.2018
comment
Вообще говоря, в спецификации XSD, когда количество элементов не указано, значение по умолчанию является обязательным и встречается только один раз (minOccurs = maxOccurs = 1). См. stackoverflow.com/questions/4821477/ < / а>. Но это даже не имеет значения, потому что спецификация (а не XSD) указывает, что атрибут является обязательным, поэтому, даже если XSD был другим, WSS4J все равно проверил бы его.   -  person GPI    schedule 16.11.2018
comment
Спасибо за информацию, не могли бы вы предоставить мне ссылку на спецификации? ИЛИ ключевые слова для быстрого поиска в Google?   -  person varunsinghal65    schedule 16.11.2018
comment
У вас есть ссылка в моем первом комментарии :-)   -  person GPI    schedule 16.11.2018


Ответы (2)


Вышеуказанный запрос отбрасывается, потому что, как указано ранее @GPI, CXF пытается применить R4201 из базовых спецификаций безопасности (http://www.ws-i.org/profiles/basicsecurityprofile-1.1.html).

Чтобы CXF не применял это, мы можем использовать константы конфигурации, предоставленные ws-security и wss4j, которые будут указывать 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.is-bsp-compliant на false:

    <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

person varunsinghal65    schedule 20.11.2018

Я столкнулся с той же проблемой и обнаружил, что проблема в запросе мыла.

Я смог решить это, добавив:

  • в мыле следующий атрибут: Конверт xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
  • следующий атрибут в wsse: Пароль Type="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>
...
person Yassine amri    schedule 06.08.2020