У меня проблема с 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 может его расшифровать!