Создание политики безопасности клиента веб-службы из .wsdl для Java - PullRequest
0 голосов
/ 13 февраля 2019

Я изучал, как реализовать клиентские политики веб-службы из файла .wsdl.

Политики веб-служб подразумевают подпись и шифрование с использованием файла .jks с необходимыми ключами (асимметричный privateKey для подписи и симметричный privateKey для шифрования).Политика: имя пользователя: oracle / wss10_username_token_with_message_protection_service_policy .

Я могу создать файлы .xsd (объекты запроса, ответа и обслуживания) с помощью инструмента wsimport для java (или с помощью cxf илиaxis2).Что я не могу решить, так это как сделать правильную политику.

Есть ли способ автоматически генерировать политики из .wsdl или мне нужно их создавать самостоятельно

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Если вы используете политики в WS-SecurityPolicy (1.1 или более поздней версии) в своем wsdl, вам не нужно ни создавать политики, ни создавать их на стороне клиента с помощью Apache CXF.С WS-SecurityPolicy среда выполнения безопасности CXF определяется политикой.

1) Вы используете WSDL-первый подход CXF для генерации клиентского кода, используя либо инструмент командной строки wsdl2java, либо Maven cxf-codegen-plugin (цель wsdl2java).Это описано в документе CXF Как разработать клиент .

2) Следуя документу CXF при WS-SecurityPolicy , вы настраиваетесвойства безопасности клиента для порта wsdl, который вы хотите использовать, используя JAX-WS API (на клиенте RequestContext) или конфигурацию Spring XML.Для списка возможных свойств есть общие XML security и WS-Security * .Пример с использованием Spring XML для политики UsernameToken (из примеров блога Глена Маззы ):

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:jaxws="http://cxf.apache.org/jaxws"
   xsi:schemaLocation="http://www.springframework.org/schema/beans 
   http://www.springframework.org/schema/beans/spring-beans.xsd
   http://cxf.apache.org/jaxws 
   http://cxf.apache.org/schemas/jaxws.xsd">
<jaxws:client name="{http://www.example.org/contract/DoubleIt}DoubleItPort" createdFromAPI="true">
        <!-- Use this for the UsernameToken Symmetric Binding w/X.509 for secret key derivation -->
        <jaxws:properties>
            <entry key="ws-security.username" value="alice"/>        
            <entry key="ws-security.callback-handler" value="client.ClientPasswordCallback"/>        
            <entry key="ws-security.encryption.properties" value="clientKeystore.properties"/>
            <entry key="ws-security.encryption.username" value="myservicekey"/>
        </jaxws:properties>

        <!-- Use this for the UsernameToken Symmetric Binding w/UT password for secret key derivation -->
        <!--jaxws:properties>
            <entry key="ws-security.username" value="alice"/>        
            <entry key="ws-security.callback-handler" value="client.ClientPasswordCallback"/>        
        </jaxws:properties-->
</jaxws:client>
</beans>

Поместите это в /cxf.xml на пути к классам.Предупреждение: в примере используется подкласс CallbackHandler ( client.ClientPasswordCallback в этом примере) для предоставления пароля.Так что вам нужно будет предоставить собственную реализацию.

3) Вернуться к документу CXF Как разработать клиент - последняя часть - в коде приложения, инициализировать клиент с помощью API JAX-WS с аргументами: a) расположение WSDL (URL) с политиками WS-SecurityPolicy (насколько я понимаю, у вас уже есть);b) QNames службы и порта, которые будут использоваться клиентом, как определено в WSDL:

final Service service = Service.create(wsdlLocation, SERVICE_QNAME);
final DoubleItPortType transportPort = service.getPort(PORT_QNAME, DoubleItPortType.class);

4) Убедитесь, что у вас есть cxf-rt-ws-policy и cxf-rt-ws-security модулей в пути к классам во время выполнения, чтобы включить WS-БезопасностьПолитическая поддержка.

0 голосов
/ 04 марта 2019

Имя пользователя: oracle / wss10_username_token_with_message_protection_service_policy решается с пружиной ws следующим образом:

<!-- == Ougoing interceptor == -->
<bean id="loginOutgoingWss4jSecurityInterceptor" class="org.springframework.ws.soap.security.wss4j2.Wss4jSecurityInterceptor">
    <property name="securementActions" value="Timestamp Signature Encrypt" />

    <!--  == Set Outgoing Signature properties == -->
    <property name="securementUsername" value="alias"/>
    <property name="securementPassword" value="aliasPass"/>
    <property name="securementSignatureKeyIdentifier" value="DirectReference"/>
    <property name="securementSignatureCrypto" ref="cryptoFactoryBean" />
    <property name="securementSignatureParts" value="{Element}{}Body;{Element}{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd}Timestamp;" />

    <!--  == Set Outgoing Encryption properties == -->
    <property name="securementEncryptionUser" value="alias"/> 
    <property name="securementEncryptionCrypto" ref="cryptoFactoryBean" />
    <property name="securementEncryptionKeyIdentifier" value="DirectReference"/>
    <property name="securementEncryptionParts" value="{Content}{}Body;" />
</bean>

<!-- == Incoming interceptor == -->
 <bean id="loginIncomingWss4jSecurityInterceptor" class="org.springframework.ws.soap.security.wss4j2.Wss4jSecurityInterceptor">
    <property name="validationActions" value="Timestamp Signature Encrypt" />

    <!--  == Set Validations Response, This validate signature and decrypts response == -->
    <property name="validateResponse" value="true" />

    <!-- The lower operation validation. Less time consume-->
    <property name="validateRequest" value="false" />
    <property name="enableSignatureConfirmation" value="false"/>

    <!--  == Set Incoming Signature/Decryption keystore == -->
    <property name="validationDecryptionCrypto" ref="cryptoFactoryBean" />
    <property name="validationSignatureCrypto" ref="cryptoFactoryBean" />

    <!-- Sets the {@link org.apache.ws.security.WSPasswordCallback} handler to use when validating messages -->
    <property name="validationCallbackHandler">
        <bean class="org.springframework.ws.soap.security.wss4j2.callback.KeyStoreCallbackHandler">
            <property name="privateKeyPassword" value="aliasPass"/>
        </bean>
    </property> 
 </bean>
...