как вызвать веб-клиент ws-security / wss4j CXF на weblogic 12c

Я еще не уверен, что имею правильное представление о 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, пожалуйста, помогите! :)

Так почему же он работает автономно, а не в контейнере? Кто-нибудь может помочь?

заранее спасибо :)


person Elias    schedule 21.12.2017    source источник


Ответы (1)


Мне удалось найти альтернативное решение. Хорошая автоматическая инъекция заголовка ws-security, которая работает на моем автономном сервере, никогда не работала с weblogic 12. Вместо этого мне пришлось настроить его вручную и заставить weblogic использовать другую реализацию JAXBContextFactory, а не собственный moxy impl. Были проблемы с moxy, хотя cxf заявлял о совместимости с moxy.

  1. Путь к классам создает следующий файл META-INF / services / javax.xml.bind.JAXBContext
  2. Добавьте в файл текст com.sun.xml.bind.v2.ContextFactory.
  3. # P2 #
    security.username=151413  
    security.password=NA   
    security.signature.username=sisprivatekey
    org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
    org.apache.ws.security.crypto.merlin.keystore.type=jks
    org.apache.ws.security.crypto.merlin.keystore.password=changeit
    org.apache.ws.security.crypto.merlin.keystore.private.password=changeit
    org.apache.ws.security.crypto.merlin.keystore.file=KeyStore.jks
    
  4. Создать обработчик обратного вызова

        CallbackHandler cpc = new CallbackHandler() {
    
        @Override
        public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
    
            for (int i = 0; i < callbacks.length; i++) {
    
                WSPasswordCallback pc = (WSPasswordCallback) callbacks[i];
    
                if (pc.getUsage() == WSPasswordCallback.SIGNATURE
                        || pc.getUsage() == WSPasswordCallback.DECRYPT) {
    
    
                        pc.setPassword("changeit");
                } else {
                    pc.setPassword("NA");
                }
            }
        }
    
    };
    
  5. Настройте wss4j / ws-security вручную:

        Client client = ClientProxy.getClient(webServicePortType);
    
    Map<String, Object> outProps = new HashMap<String, Object>();
    
    outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN + " "
            + WSHandlerConstants.TIMESTAMP + " " + WSHandlerConstants.SIGNATURE);
    outProps.put(WSHandlerConstants.USER, user);
    outProps.put(WSHandlerConstants.PW_CALLBACK_REF, callBackHandler);
    outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
    outProps.put(WSHandlerConstants.SIG_PROP_FILE, signaturePropertyFilePath);
    outProps.put(WSHandlerConstants.SIG_KEY_ID, "DirectReference");
    outProps.put(WSHandlerConstants.SIGNATURE_PARTS,
            "{Element}{http://schemas.xmlsoap.org/soap/envelope/}Body;{Element}{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd}Timestamp");
    
    client.getOutInterceptors().add(new WSS4JStaxOutInterceptor(outProps));
    
  6. Сделанный.

person Elias    schedule 05.01.2018