Hi,

a) jaxws client
1) You can set message property:
SecurityConstants.ENCRYPT_PROPERTIES and dynamically update property file 
location:
message. put(SecurityConstants.ENCRYPT_PROPERTIES, <new property location>);
WSS4J will automatically use these properties.

It is possible to do it either in custom interceptor (should be called before 
WSS4JOutInterceptor) or in client logic via:
((BindingProvider)proxy).getRequestContext().put(SecurityConstants.ENCRYPT_PROPERTIES,
 <new property location>).

Cons of this solution: you are still restricted to use keystore.properties file.

2) More generic solution is implement own CryptoProvider (implements wss4j 
CryptoBase interface) and set this implementation in 
SecurityConstants.ENCRYPT_CRYPTO message property. In provider implementation 
you can get certificates and private keys whatever you want: from keystore, 
remotely from service, etc.

b) http conduit
TLS parameters can be also configured programmatically:
Client c = ClientProxy.getClient(port);
HTTPConduit conduit = (HTTPConduit) c.getConduit();
TLSClientParameters tlsParams = new TLSClientParameters();
...
conduit.setTlsClientParameters(tlsParams);

see 
http://blog.progs.be/71/cxf-simple-frontend-allow-all-ssl-certificates-and-set-basic-authentication-credentials
 for details.

I hope this can help.

Cheers,
Andrei.

> -----Original Message-----
> From: Ed Bras [mailto:z...@debrasjes.com]
> Sent: Mittwoch, 12. Dezember 2012 15:16
> To: users@cxf.apache.org
> Subject: How to use ws-security info per sending soap message in CXF?
> 
> Please some advice on the following requirement:
> I like to be able to dynamically change/set the ws-security info per sending
> soap message in cxf. How can this best be done.
> 
> Details: I want to change settings like keystore name, keystore alias,
> password, host name, etc.. during runtime, preferable per sending message.
> 
> Currently I am using: jaxws client with WSS4JOutInterceptor and
> WSS4JInInterceptor interceptor for signing. And I am using http conduit with
> tls client parameters for SSL/TLS communications. Both the jaxws client and
> http conduit are configured in spring and have their configuration like
> keystore name, alias and password set in the Spring config.
> 
> I see options:
> 1) I change these settings during runtime through a global property.
> 2) I change these settings per sending message (preferable).
> 
> 2) Is preferable but most difficult I think. How should I do this?
> 
> I was thinking about:
> a) jaxws client: make my own in- and out interceptor that intercepts a
> message and use the correct (cached) WSS4JOutInterceptor interceptor
> depending on the security settings that that message requires. If the
> WSS4JOutInterceptor interceptor doesn't exists in cache, it's created (I
> probably have max 5 WSS4JOutInterceptor instances cached).
> However, how can I determine which settings are required in my interceptor
> as that is known in an other part of the app when talking to the @Webservice
> proxy to create and send the soap request/message... Maybe I could be able
> to add some kind of securityInfo object to the soap message through the
> JaxWsClientProxy, but how ?... Or maybe I can set the interceptors when
> sending/creating the soap message when this security info is still know.
> This will then be a light weight interceptor containing the required settings,
> linking to the cached interceptors, that is selected depending on the
> settings...
> 
> b) http conduit: using a ConduitSelector (never used it but will find out), 
> such
> that I am able to select the correct http conduit, but I have the same problem
> as in (a): "How to determine which settings I should use" as they are known
> when creating/sending a soap message and the interceptors are set later...
> Probably I have to set an conduit selector per sending message..
> 
> Please some advice?
> - Ed

Reply via email to