Hi,
I have an issue using symmetric key encryption in WSS4J. My problem is
the following:

My goal is to configure WSS4J to encrypt a (part of) message with a
symmetric key (both client and server know in advance that key).
I'm using CXF 2.5.1, and WSS4J 1.6.0

I created a symmetricStore with keytool (JDK 1.6.0), and I configured
the client:

action: Encrypt
embeddedKeyCallbackClass:
org.openspcoop.wssecurity.SymmetricCallbackHandler      
encryptionKeyIdentifier: EmbeddedKeyName
encryptionPropFile: symmetric-crypto.properties 
isBSPCompliant: false
user: symmetric

and the server:

action: Encrypt
decryptionPropFile: symmetric-crypto.properties
encryptionKeyIdentifier: EmbeddedKeyName
isBSPCompliant: false
PasswordCallbackClass:
org.openspcoop.wssecurity.SymmetricCallbackHandler

org.openspcoop.wssecurity.SymmetricCallbackHandler class is a custom
CallbackHandler which does nothing but set the key in the
WsPasswordCallback by calling the setKey(byte[]) method.

With such a configuration message is encypted and decrypted correctly.
My problem is that such a configuration is not Basic Security Profile
compliant. If I set isBSPCompliant to true, I get the following
exception on receiver side:

org.apache.ws.security.WSSecurityException: An error was discovered
processing the <wsse:Security> header (WSSecurityEngine: EncryptedKey
does not contain ds:KeyInfo/wsse:SecurityTokenReference)
        at
org.apache.ws.security.processor.ReferenceListProcessor.checkBSPCompliance(ReferenceListProcessor.java:197)
        at
org.apache.ws.security.processor.ReferenceListProcessor.decryptDataRefEmbedded(ReferenceListProcessor.java:137)
        at
org.apache.ws.security.processor.ReferenceListProcessor.handleReferenceList(ReferenceListProcessor.java:96)
        at
org.apache.ws.security.processor.ReferenceListProcessor.handleToken(ReferenceListProcessor.java:63)
        at
org.apache.ws.security.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:396)
        at
org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:248)

In fact, monitoring the message which is passing, I saw that no
SecurityTokenReference is included, and the wsse:Security header looks
like:

<wsse:Security
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
 
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";>
         <xenc:ReferenceList
xmlns:xenc="http://www.w3.org/2001/04/xmlenc#";>
            <xenc:DataReference URI="#ED-29"/>
         </xenc:ReferenceList>
</wsse:Security>

I checked the Basic Profile specs about it:
http://www.ws-i.org/Profiles/BasicSecurityProfile-1.1.html#Exactly_One_SecurityTokenReference_Child_Element
and I'm not sure wheter this SecurityTokenReference should be included:
it seems to me that, IF a SecurityTokenReference is provided, it must
have exactly one child.

Am i getting this right? and if I'm wrong, anybody knows how can I
achieve encrypting with symmetric key, in a BSPCompliant way?

Thanks in advance!
-- 
Giovanni Bussu

Reply via email to