Я еще не уверен, что имею правильное представление о wssecurity, поэтому, пожалуйста, исправьте меня в том порядке, в котором мне нужно что-то делать, я постараюсь объяснить свою проблему.
Я пытаюсь реализовать клиент jaxws из wsdl с включенной политикой, политика выглядит так:
<wsp:Policy wsu:Id="AsymmetricX509TokensWithUntPolicy">
<wsp:ExactlyOne>
<wsp:All>
<sp:SupportingTokens xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
<wsp:Policy>
<sp:UsernameToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:WssUsernameToken10/>
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SupportingTokens>
<sp:AsymmetricBinding>
<wsp:Policy>
<sp:InitiatorToken>
<wsp:Policy>
<sp:X509Token sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:WssX509V3Token10/>
</wsp:Policy>
</sp:X509Token>
</wsp:Policy>
</sp:InitiatorToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic128/>
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:Layout>
<wsp:Policy>
<sp:Lax/>
</wsp:Policy>
</sp:Layout>
<sp:IncludeTimestamp/>
<sp:ProtectTokens/>
<sp:OnlySignEntireHeadersAndBody/>
</wsp:Policy>
</sp:AsymmetricBinding>
<sp:SignedParts>
<sp:Body/>
<sp:Header Name="Timestamp" Namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"/>
</sp:SignedParts>
<sp:Wss11>
<wsp:Policy>
<sp:MustSupportRefKeyIdentifier/>
</wsp:Policy>
</sp:Wss11>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
Мне удалось создать автономный клиент cxf, взаимодействующий с защищенным веб-сервисом в основном из-за этих зависимостей в структуре cxf.
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-security</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-policy</artifactId>
<version>3.2.1</version>
</dependency>
Они имеют автоматический характер предоставления заголовка и делают много вещей за кулисами, которых я не понимаю, но это работает. Моя настройка для клиента проста:
Map ctx = ((BindingProvider) webServicePortType).getRequestContext();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Properties props = new Properties();
try (InputStream resourceStream = loader.getResourceAsStream(signaturePropertyFilePath)) {
props.load(resourceStream);
} catch (IOException e) {
throw new RuntimeException(
"IOException: Unresolvable signature property filepath: " + signaturePropertyFilePath, e);
}
props.forEach((k, v) -> {
ctx.put(k.toString(), v);
});
ctx.put(SecurityConstants.CALLBACK_HANDLER, callBackHandler);
ctx.put(SecurityConstants.SIGNATURE_PROPERTIES, signaturePropertyFilePath);
Теперь моя проблема, я видел, как она работает, поэтому я с радостью перевожу свой клиент в веб-приложение, работающее на weblogic 12c, но теперь все идет не так. Приятный автоматический характер cxf-rt-ws-policy теперь исчезает, и я получаю запрос мыла без заголовка, который вызывает ошибки:
These policy alternatives can not be satisfied:
{http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702} UsernameToken: полученный токен не соответствует требованию включения токена {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702} AsymmetricBinding: полученная отметка времени не соответствует требованиям {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702} InitiatorToken {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702} X509Token: полученный токен не соответствует требованию включения токена {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702} IncludeTimestamp {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702} ProtectTokens {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702} OnlySignEntireHeadersAndBody {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702} SignedParts: {http://www.w3.org/2003/05/soap-envelope } Тело НЕ ПОДПИСАНО
Результат без заголовка.
К счастью, у меня нет проблем с запуском клиентов cxf на weblogic в целом, если веб-сервисы не требуют безопасности. В моем работающем автономном клиенте нет Spring или Spring начальной загрузки, возможно, cxf вызывает Spring сам по себе, но я не помогу.
"PolicyInterceptorProviderRegistryImpl", взятый из структуры cxf, перестает работать при запуске в weblogic. Я подозреваю, что это связано с тем, что cxf bus-extensions.txt работает иначе при работе в контейнере. Spring недоступен в веб-приложении на weblogic, извините. А вот у меня автономная без всякой пружины работает нормально. Кто-нибудь на cxf framework, пожалуйста, помогите! :)
Так почему же он работает автономно, а не в контейнере? Кто-нибудь может помочь?
заранее спасибо :)