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

У меня проблема с ax2+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 OK" или как в soapUI. Есть идеи, что не так с моей конфигурацией?

РЕДАКТИРОВАТЬ

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

1 ответ

Решение

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

Я искал источники 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> 
Другие вопросы по тегам