Hi,

I was hoping someone could shed some light on the cause of the exception
attached in the text file "JavaStack.txt".

I'm using the WSS4J API to decode a message with signed body and time stamp
and encrypted body (using Certificates).

It happens in the method decodeSOAP on the line:
 
results =
this.secEngine.processSecurityHeader(doc,null,this.callbackHandler,this.cryp
to);

I've dug down a little and I think it is trying to invoke a method that does
not exist - but I don't have the skills to setup my Java installation so I
can set a break point within the Reflection API.

I've attached a good bit of the source, but it is in the decodeSOAP method -
where I presume I have forgotten to initialise some aspect of the Wss4J
interface

Anyone know what I've not done?

Thanks

Adrian
09:02:25.691 [main] DEBUG o.a.w.d.processor.SignatureProcessor - Verify XML 
Signature
09:02:25.722 [main] DEBUG org.apache.wss4j.common.util.Loader - Trying to find 
[wss4j-ehcache.xml] using sun.misc.Launcher$AppClassLoader@550a6723 class 
loader.
Failed in processSecurityHeader block: 
java.lang.reflect.InvocationTargetException
failed: java.lang.reflect.InvocationTargetException
org.apache.wss4j.common.ext.WSSecurityException: 
java.lang.reflect.InvocationTargetException
Original Exception was net.sf.ehcache.CacheException: 
java.lang.reflect.InvocationTargetException
    at 
org.apache.wss4j.dom.processor.SignatureProcessor.verifyXMLSignature(SignatureProcessor.java:446)
    at 
org.apache.wss4j.dom.processor.SignatureProcessor.verifyXMLSignature(SignatureProcessor.java:446)
    at 
org.apache.wss4j.dom.processor.SignatureProcessor.handleToken(SignatureProcessor.java:233)
    at 
org.apache.wss4j.dom.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:427)
    at 
org.apache.wss4j.dom.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:309)
    at 
org.apache.wss4j.dom.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:254)
    at 
org.apache.wss4j.dom.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:208)
    at SecurityManager.decodeSOAP(SecurityManager.java:212)
    at SecurityManager.handleMessage(SecurityManager.java:102)
    at SecurityManager.handleMessage(SecurityManager.java:48)
    at 
com.sun.xml.internal.ws.handler.HandlerProcessor.callHandleMessageReverse(HandlerProcessor.java:326)
    at 
com.sun.xml.internal.ws.handler.HandlerProcessor.callHandlersResponse(HandlerProcessor.java:199)
    at 
com.sun.xml.internal.ws.handler.ClientSOAPHandlerTube.callHandlersOnResponse(ClientSOAPHandlerTube.java:148)
    at 
com.sun.xml.internal.ws.handler.HandlerTube.processResponse(HandlerTube.java:149)
    at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:636)
    at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:585)
    at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:570)
    at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:467)
    at com.sun.xml.internal.ws.client.Stub.process(Stub.java:308)
    at com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:163)
    at 
com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:98)
    at 
com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
    at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:135)
    at com.sun.proxy.$Proxy22.driverDetailsOperation(Unknown Source)
    at Driver.main(Driver.java:96)
Caused by: net.sf.ehcache.CacheException: 
java.lang.reflect.InvocationTargetException
    at 
org.apache.wss4j.common.cache.EHCacheManagerHolder.createCacheManager(EHCacheManagerHolder.java:165)
    at 
org.apache.wss4j.common.cache.EHCacheManagerHolder.getCacheManager(EHCacheManagerHolder.java:101)
    at 
org.apache.wss4j.common.cache.EHCacheReplayCache.<init>(EHCacheReplayCache.java:43)
    at 
org.apache.wss4j.common.cache.EHCacheReplayCacheFactory.newReplayCache(EHCacheReplayCacheFactory.java:31)
    at 
org.apache.wss4j.dom.handler.RequestData.createCache(RequestData.java:373)
    at 
org.apache.wss4j.dom.handler.RequestData.getTimestampReplayCache(RequestData.java:364)
    at 
org.apache.wss4j.dom.processor.SignatureProcessor.testMessageReplay(SignatureProcessor.java:647)
    at 
org.apache.wss4j.dom.processor.SignatureProcessor.verifyXMLSignature(SignatureProcessor.java:416)
    ... 23 more
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at 
org.apache.wss4j.common.cache.EHCacheManagerHolder.createCacheManager(EHCacheManagerHolder.java:163)
    ... 30 more
Caused by: java.lang.NoSuchMethodError: 
org.slf4j.helpers.MessageFormatter.arrayFormat(Ljava/lang/String;[Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
    at 
ch.qos.logback.classic.spi.LoggingEvent.getFormattedMessage(LoggingEvent.java:298)
    at 
ch.qos.logback.classic.spi.LoggingEvent.prepareForDeferredProcessing(LoggingEvent.java:208)
    at 
ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:212)
    at 
ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:103)
    at 
ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:88)
    at 
ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:48)
    at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:273)
    at ch.qos.logback.classic.Logger.callAppenders(Logger.java:260)
    at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:442)
    at ch.qos.logback.classic.Logger.filterAndLog_1(Logger.java:414)
    at ch.qos.logback.classic.Logger.warn(Logger.java:717)
    at 
net.sf.ehcache.config.ConfigurationFactory.parseConfiguration(ConfigurationFactory.java:136)
    at net.sf.ehcache.CacheManager.newInstance(CacheManager.java:854)
    ... 35 more
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */


import java.util.Set;
import java.util.List;
import java.util.ArrayList;
import java.util.HashSet;
import java.security.cert.*;
import javax.xml.namespace.QName;
import javax.xml.soap.*;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.security.auth.callback.CallbackHandler;
import org.apache.wss4j.common.crypto.*;
import org.apache.wss4j.dom.WSConstants;
import org.apache.wss4j.dom.SOAPConstants;
import org.apache.wss4j.dom.message.*;
import org.apache.wss4j.common.ext.WSSecurityException;
import org.apache.wss4j.common.WSEncryptionPart;
import org.apache.wss4j.dom.WSSecurityEngine;
import org.apache.wss4j.dom.WSSecurityEngineResult;
import org.apache.wss4j.dom.WSSConfig;
import org.apache.wss4j.dom.handler.RequestData;
import org.w3c.dom.Document;
import org.w3c.dom.Node;


/**
 *
 * @author awilliamson
 */
public class SecurityManager implements SOAPHandler<SOAPMessageContext> {

    static BallKeyStore keysRSA = new BallKeyStore(); 
    private Node root = null;
    private Crypto crypto = null;
    private WSSecurityEngine secEngine = new WSSecurityEngine();
    private CallbackHandler callbackHandler = new PWCallback();
    private RequestData requestData = new RequestData();
    
    public SecurityManager(){
         
        try {
            //Where will I put the properties file?
            this.crypto = CryptoFactory.getInstance("Ball.properties");
        }
        catch (WSSecurityException e)
        {
            System.err.println("Crypto crypto = 
CryptoFactory.getInstance(\"Ball.properties\"): " + e.getMessage());    
        }
        
        this.secEngine.setWssConfig(WSSConfig.getNewInstance());  
        
        //I don't think this is needed by the processSecurityHeader mechanism 
used 
        this.requestData.setWssConfig(this.secEngine.getWssConfig());
        
    }
    
 @Override
 public boolean handleMessage(SOAPMessageContext context) {
     
     
  Boolean outbound = (Boolean) 
context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
  
  SOAPMessage message = context.getMessage();
  
  if (outbound) {
      System.out.println("SOAP message departingÂ…");
        //Get the body and scramble it with the certifcate, then push it back 
in.
        try {
            message = this.encodeSOAP(message);
            message.writeTo(System.out);
            System.out.println();

        } catch (Exception e) {
            System.out.println(e);
            e.printStackTrace();
        }
        
  } else {
      System.out.println("SOAP message incomingÂ…");            
        try {
            message.writeTo(System.out);
            System.out.println();
            message = this.decodeSOAP(message);

        } catch (Exception e) {
            System.out.println(e);
            e.printStackTrace();
        }
  }


  
  return true;
 }
 
 @Override
 public boolean handleFault(SOAPMessageContext context) {
  return true;
 }
    
 @Override
 public void close(MessageContext context) {
 }
 
 @Override
 public Set<QName> getHeaders() {
  //return Collections.emptySet();
    QName securityHeader = new 
QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";,
 "Security", "wsse");
    HashSet<QName> headers = new HashSet<QName>();
    headers.add(securityHeader);
    return headers;
     
 }

private SOAPMessage encodeSOAP(SOAPMessage soapMessage) throws Exception  {
    
    
    SOAPPart soapPart = soapMessage.getSOAPPart();
    SOAPEnvelope  soapEnvelope = soapPart.getEnvelope();
       
    WSSecEncrypt builder  = new WSSecEncrypt();
    WSSecTimestamp builderTS = new WSSecTimestamp();
    WSSecSignature builderSig = new WSSecSignature();
       
    java.security.cert.X509Certificate recipientCert = (X509Certificate) 
keysRSA.getks().getCertificate("wsstestservice");   
    java.security.cert.X509Certificate ourCert = (X509Certificate) 
keysRSA.getks().getCertificate("wsstest"); 

    builder.setUseThisCert(recipientCert);        
    builder.setKeyIdentifierType(WSConstants.BST_DIRECT_REFERENCE);
    builder.setSymmetricEncAlgorithm(WSConstants.TRIPLE_DES);
    builderTS.setTimeToLive(5000);

    Document doc = soapEnvelope.getOwnerDocument();
    org.apache.wss4j.dom.message.WSSecHeader secHeader = new WSSecHeader();
    secHeader.insertSecurityHeader(doc);
    
    {//Sign the Timestamp and the body this block replaces 
builderSig.build(doc, crypto, secHeader)
        builderSig.setX509Certificate(ourCert);
        builderSig.setUserInfo("wsstest", "password1");
        builderSig.setKeyIdentifierType(WSConstants.BST_DIRECT_REFERENCE);
        
        SOAPConstants soapConstants = 
org.apache.wss4j.dom.util.WSSecurityUtil.getSOAPConstants(doc.getDocumentElement());
     
        List<WSEncryptionPart> wsEncryptionParts = new 
ArrayList<WSEncryptionPart>();
        WSEncryptionPart wsEncryptionPart = new WSEncryptionPart( 
soapConstants.getBodyQName().getLocalPart(),
                                                                  
soapConstants.getEnvelopeURI(), "Content");
        wsEncryptionParts.add(wsEncryptionPart);        
        builderTS.build(doc, secHeader);
        wsEncryptionParts.add(new WSEncryptionPart(builderTS.getId()));         
 
        builderSig.setParts(wsEncryptionParts);
        builderSig.setUseSingleCertificate(true);
        builderSig.prepare(doc, this.crypto, secHeader);
        builderSig.appendBSTElementToHeader(secHeader);        
        List<javax.xml.crypto.dsig.Reference> referenceList = 
builderSig.addReferencesToSign(wsEncryptionParts, secHeader); 
        builderSig.computeSignature(referenceList);
        
    }    
    
    try
    {  
        builder.build(doc, this.crypto, secHeader);        
    }
    catch (WSSecurityException e)
    {
        System.err.println("Failed in builder block: " + e.getMessage());
        e.printStackTrace();
        System.exit(1);       
    }

    return soapMessage;
}

private SOAPMessage decodeSOAP(SOAPMessage soapMessage) throws Exception  {
    
    SOAPPart soapPart = soapMessage.getSOAPPart();
    SOAPEnvelope  soapEnvelope = soapPart.getEnvelope();
    
    Document doc = soapEnvelope.getOwnerDocument();
    //Process Header...
    List<WSSecurityEngineResult> results = null;
    
    
    try
    { 
        results = 
this.secEngine.processSecurityHeader(doc,null,this.callbackHandler,this.crypto);
    }
    catch (WSSecurityException e)
    {
        System.err.println("Failed in processSecurityHeader block: " + 
e.getMessage());
        e.printStackTrace();
        System.exit(1);
    }
    
    if (results==null)
    {
        //failed?
    }
    
    //Process Body...
    
    
    return soapMessage;
};




    private static void dumpDocument(Node root) throws TransformerException {
    Transformer transformer = TransformerFactory.newInstance().newTransformer();
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    transformer.transform(new DOMSource(root), new StreamResult(System.out));
  }
  
}


********************* Callback Handler *******************************


import java.io.IOException;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;

import org.apache.wss4j.common.ext.WSPasswordCallback;

public class PWCallback implements CallbackHandler {

  public void handle(Callback[] callbacks)
    throws IOException, UnsupportedCallbackException {
    for (int i = 0; i < callbacks.length; i++) {
      if (callbacks[i] instanceof WSPasswordCallback) {
        WSPasswordCallback pc = (WSPasswordCallback) callbacks[i];
 
        if (pc.getUsage() == WSPasswordCallback.DECRYPT) {
          pc.setPassword("password1");
        }
         else {
        throw new UnsupportedCallbackException(
          callbacks[i], "Unrecognized Usage: " + pc.getUsage());
      } 
 
      } else {
        throw new UnsupportedCallbackException(
          callbacks[i], "Unrecognized Callback");
      }
    }
  }
}


******************* Snippets from the stack dump 
**************************************

    static CacheManager createCacheManager() throws CacheException {
        try {
            return (CacheManager)cacheManagerCreateMethodNoArg.invoke(null, 
(Object[])null);
        } catch (Exception e) {
            throw new CacheException(e);
        }
    }
    
        @CallerSensitive
        public Object invoke(Object obj, Object... args)
            throws IllegalAccessException, IllegalArgumentException,
               InvocationTargetException
        {
            if (!override) {
                if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
                    // Until there is hotspot @CallerSensitive support
                    // can't call Reflection.getCallerClass() here
                    // Workaround for now: add a frame getCallerClass to
                    // make the caller at stack depth 2
                    Class<?> caller = getCallerClass();
                    checkAccess(caller, clazz, obj, modifiers);
                }
            }
            MethodAccessor ma = methodAccessor;             // read volatile
            if (ma == null) {
                ma = acquireMethodAccessor();
            }
            return ma.invoke(obj, args);
    }
    
    package sun.reflect;
    
    import java.lang.reflect.InvocationTargetException;
    
    public interface MethodAccessor {
    
        public Object invoke(Object o, Object[] os) throws 
IllegalArgumentException, InvocationTargetException;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to