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>