Я пытаюсь настроить службу и клиент CXF, используя UsernameTokenSignature. Начальная точка — это существующая служба с кодом. К сожалению, все примеры, которые я нашел, используют WS-Policy, которая, как я понимаю, не поддерживается CXF в первом сценарии кода.
Мне удалось создать клиент, который отправляет сообщения, как я ожидаю, используя эту конфигурацию:
Клиент:
<jaxws:client id="clientWithUsernameTokenSignature" serviceClass="mypackage.MyServiceInterface" address="http://localhost:8081/ws-security-secured-soap-service/services/Service_v1">
<jaxws:outInterceptors>
<ref bean="WSS4JOutInterceptor_UsernameTokenSignature" />
</jaxws:outInterceptors>
</jaxws:client>
WSS4JOutInterceptor
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor" id="WSS4JOutInterceptor_UsernameTokenSignature">
<constructor-arg>
<map>
<entry key="action" value="UsernameTokenSignature" />
<entry key="user" value="Admin" />
<entry key="passwordCallbackClass" value="mypackage.ClientCallbackHandler" />
</map>
</constructor-arg>
</bean>
Однако мне не удалось настроить службу для правильной обработки сообщений от этого клиента. Я старался:
Сервис:
<jaxws:endpoint id="soapServ_v3" implementor="#myServiceFacade" address="/MyService_v1">
<jaxws:inInterceptors>
<ref bean="WSS4JInInterceptor_UsernameTokenSignature" />
</jaxws:inInterceptors>
</jaxws:endpoint>
WSS4JInInterceptor
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor" id="WSS4JInInterceptor_UsernameTokenSignature">
<constructor-arg>
<map>
<entry key="action" value="UsernameTokenSignature" />
<entry key="passwordCallbackClass" value="mypackage.ServerCallbackHandler" />
</map>
</constructor-arg>
</bean>
При этом сервер не принимает сообщения от клиента и отвечает ошибкой безопасности. При отладке я обнаружил, что первое место, где он терпит неудачу, — это verifyUnknownPassword в org.apache.wss4j.dom.validate.UsernameTokenValidator. Здесь для параметра allowUsernameTokenDerivedKeys установлено значение false. Я предполагаю, что есть некоторая конфигурация, которую я могу установить, чтобы получить значение true.
Какая правильная конфигурация сервера позволяет использовать ключи, производные от токена имени пользователя?
Даже если я использую отладчик, чтобы изменить значение на true, вызов службы все равно не работает. В этом случае перехватчик выдает исключение в checkActions: «Обнаружена ошибка при обработке заголовка».
Так что я предполагаю, что мне нужно настроить что-то еще. Кто-нибудь знает, как это правильно настроить?