axis2 + rampart: необходимо понять, проверка не удалась для заголовка Безопасность - PullRequest
2 голосов
/ 01 апреля 2011

У меня проблема с axis2 + rampart Ответ WS-Security в случае внутренней ошибки сервера.Когда сервер возвращает «200 OK», все кажется в порядке.Ответ проверяется rampart, если он имеет правильную метку времени, подпись и дешифрует XML-ответ функции.Но когда сервер возвращает «500 Internal Server Error», исключение axis2 / rapart выдает:

ERROR Thread-11 org.apache.axis2.engine.AxisEngine - Must Understand check failed for header

Я подумал, что с ответом что-то не так, и проверил его с помощью soapUI.Похожий ответ приходит как в защищенном, так и в расшифрованном виде.Эти ответы отличаются только статусом HTTP, кодом ответа XML, указывающим на ошибку, и регистром SOAP-тегов.В случае хорошего ответа есть

<SOAP-ENV:Envelope ...

В случае ошибки:

<soap:Envelope ...

Остальная часть структуры, включая mustUnderstand="1", является такой же.

Вaxis2.xml Я настроил InFlow и InFaultFlow так, чтобы они совпадали с заказом:

<phase name="Addressing">...</phase>
<phase name="Security"/>
<phase name="PreDispatch"/>

Я включил трассировку своего клиента и в случае хорошего ответа вижу:

DEBUG Thread-11 org.apache.rampart.RampartEngine - Enter process(MessageContext msgCtx)
DEBUG Thread-11 org.apache.axis2.engine.Phase - [MessageContext: logID=urn:uuid:UUID] Invoking Handler 'SecurityInHandler' in Phase 'Security'
...there is decrypted message
DEBUG Thread-11 org.apache.rampart.handler.WSDoAllReceiver - WSDoAllReceiver: exit invoke()
DEBUG Thread-11 org.apache.axis2.engine.Phase - [MessageContext: logID=urn:uuid:UUID] Checking post-conditions for phase "Security"
DEBUG Thread-11 org.apache.axis2.engine.Phase - [MessageContext: logID=urn:uuid:UUID] Checking pre-condition for Phase "PreDispatch"
...

В случае ошибки такой трассировки нет:

DEBUG Thread-11 org.apache.rampart.RampartEngine - Enter process(MessageContext msgCtx)
DEBUG Thread-11 org.apache.axis2.engine.Phase - [MessageContext: logID=urn:uuid:UUID] Checking post-conditions for phase "Security"
DEBUG Thread-11 org.apache.axis2.engine.Phase - [MessageContext: logID=urn:uuid:UUID] Checking pre-condition for Phase "PreDispatch"
...
DEBUG Thread-11 org.apache.axis2.engine.Phase - [MessageContext: logID=urn:uuid:UUID] Checking post-conditions for phase "soapmonitorPhase"
DEBUG Thread-11 org.apache.axis2.engine.AxisEngine - MustUnderstand header not processed or registered as understood{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security
DEBUG Thread-11 org.apache.axis2.i18n.ProjectResourceBundle - org.apache.axis2.i18n.resource::handleGetObject(mustunderstandfailed)
ERROR Thread-11 org.apache.axis2.engine.AxisEngine - Must Understand check failed for header http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd : Security
org.apache.axis2.AxisFault: Must Understand check failed for header http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd : Security
at org.apache.axis2.engine.AxisEngine.checkMustUnderstand(AxisEngine.java:97)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:163)
at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:364)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:417)
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)

Нет вызова SecurityInHandler.

Я хотел бы видеть дешифрованное сообщение, как в случае "200ОК "статус или как в soapUI.Любые идеи, что не так с моей конфигурацией?

EDIT

Я проверил, что я получил такую ​​ошибку только в случае «500 Internal Server Error».Если сервер отвечает «200 OK» и тем же зашифрованным контентом, то axis2 может его расшифровать!

1 Ответ

3 голосов
/ 05 апреля 2011

Я отвечу себе:

Я искал источники Rampart, чтобы узнать, где находится SecurityInHandler. Это было в META-INF/module.xml из rampart-1.5.1.mar, но только в <InFlow> разделе. Я скопировал его на <InFaultFlow>, и он работает! Теперь мой <InFaultFlow> раздел выглядит так:

<InFaultFlow>
    <handler name="PolicyBasedSecurityInHandler" class="org.apache.rampart.handler.RampartReceiver">
        <order phase="Security" phaseFirst="true"/>
    </handler>
    <handler name="SecurityInHandler" class="org.apache.rampart.handler.WSDoAllReceiver">
        <order phase="Security"/>
    </handler>
    <handler name="PostDispatchVerificationHandler" class="org.apache.rampart.handler.PostDispatchVerificationHandler">
        <order phase="Dispatch" phaseLast="true"/>
    </handler>
</InFaultFlow> 
...