Search code examples
javasoapdigital-signaturews-securityencryption-symmetric

Generate web service client secure policy from .wsdl for java


I have been researching how to implement a web service client policies from a .wsdl file.

The policies of the web services implicates a signature and encryption using a .jks file with the necessary keys (asymmetric privateKey for signing, and a symmetric privateKey for encryption). The policy is: username:oracle/wss10_username_token_with_message_protection_service_policy.

I am able to make the .xsd files (request, response and service objects) using the wsimport tool for java (or with cxf or axis2). What i can't resolve is how to make the correct policy.

Is there any way to automatically generate the policies from the .wsdl or do i have to make them by myself


Solution

  • The username:oracle/wss10_username_token_with_message_protection_service_policy is solved with spring ws this way:

    <!-- == 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>