this Rampart example might help
assume has the following parameters:

requestService(resp.getFirstChildWithName(new QName(RahasConstants.WST_NS_05_12,
                                                              
RahasConstants.LocalNames.
                                                                      
REQUEST_SECURITY_TOKEN_RESPONSE)).getFirstChildWithName(new 
QName(RahasConstants.WST_NS_05_12,
                                                             
RahasConstants.IssuanceBindingLocalNames.
                                                                     
REQUESTED_SECURITY_TOKEN)).getFirstChildWithName(new 
QName(RahasConstants.SAML_NS, "Assertion")),   //First param is the OMElement 
to send to service
WSSecurityUtil.generateNonce(16),   //byte[] requestEntity
Base64.decode(respEntrB64)            //byte [] responseEntity
);
 
    private void requestService(org.apache.axiom.om.OMElement assertion, byte[] 
reqEnt, byte[] respEnt) throws Exception {
//StaxBuilder
        org.apache.axiom.om.impl.builder.StAXOMBuilder builder = new 
org.apache.axiom.om.impl.builder.StAXOMBuilder(new 
org.apache.axiom.om.impl.dom.factory .OMDOMFactory(), 
assertion.getXMLStreamReader());
//get the Element which corresponds to Document
        Element domAssertionElem = (Element)builder.getDocumentElement();
//set factory to Document Object Not linkedList
        DocumentBuilderFactoryImpl.setDOOMRequired(true);
//get the dom_doc
        org.w3c.dom.Document dom_doc = 
javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
//SOAP11 Specific doc
        org.apache.axiom.soap.SOAPFactory soap11_fac = new 
org.apache.axiom.soap.impl.dom.soap11.SOAP11Factory((org.apache.xerces.dom.DocumentImpl)dom_doc);
//get the SOAP11 specific envelope
  org.apache.axiom.soap.SOAPEnvelope soap11_envelope = 
soap11_fac.getDefaultEnvelope();
//add the envelope to the SOAP11 doc
  this.addPayload(soap11_envelope);
//acquire a secure Header
        org.apache.ws.security.message.WSSecHeader secHeader = new 
org.apache.ws.security.message.WSSecHeader();
//add the DOM doc to the Secure Header
     secHeader.insertSecurityHeader(dom_doc);
//acquire Secure timestamp
        org.apache.ws.security.message.WSSecTimestamp ts = new 
org.apache.ws.security.message.WSSecTimestamp();
//timestamp is usually a point in time capture
//secure_timestamp specific doc
        ts.prepare(dom_doc);
//timestamp specific securityHeader
        ts.prependToHeader(secHeader);
//get the secure signature
        org.apache.ws.security.message.WSSecDKSign secure_dk_sig = new 
org.apache.ws.security.message.WSSecDKSign();
//set the algorithm for the signature
  secure_dk_sig.setSignatureAlgorithm(XMLSignature.ALGO_ID_MAC_HMAC_SHA1);
//Secure_Handshake v1
  org.apache.ws.security.conversation.dkalgo.P_SHA1 p_sha1 = new 
org.apache.ws.security.conversation.dkalgo.P_SHA1();
//the secure_token from the doc
         org.apache.ws.security.message.token.SecurityTokenReference 
security_token_ref = new 
org.apache.ws.security.message.token.SecurityTokenReference(dom_doc);
//set the key of the SecurityTokenReference to be attribute of assertion_id
         
security_token_ref.setSAMLKeyIdentifier(assertion.getAttributeValue(new 
org.xmlsoap.schemas.soap.encoding.QName("AssertionID")));
//show the requestEntropy and responseEntropy
        System.out.println("\nRequest Entropy: " + Base64.encode(reqEnt));
        System.out.println("Response Entropy: " + Base64.encode(respEnt));
//create sha1_key using request_Entropy and response_Entropy using SHA1 algo
        byte[] sha1_ephmeralKey = p_sha1.createKey(reqEnt, respEnt, 0, 32);
//display the ephemeral key
        System.out.println( ephmeralKey.length * 8 + " bit Key: " + 
Base64.encode(sha1_ephmeralKey));
//associate sha1_key to security_token_ref
        secure_dk_sig.setExternalKey(sha1_ephmeralKey, 
security_token_ref.getElement());
//create Encrypted_timestamp
        WSEncryptionPart timestamp_encrypted_part = new 
WSEncryptionPart(WSConstants.TIMESTAMP_TOKEN_LN, WSConstants.WSU_NS, "Element");
//create a vector
        Vector partsVector = new Vector();
//add timestamp_encrypted_part to vector
  partsVector.add(timestamp_encrypted_part);
//associate dk sig to partsVector
     secure_dk_sig.setParts(partsVector);
//use the dk_sig to put a secureHeader on the dom_doc
        secure_dk_sig.prepare(dom_doc, secHeader);
//which parts to sign..timestamp in partsVector and secHeader
        secure_dk_sig.addReferencesToSign(partsVector, secHeader);
//compute the signature
  secure_dk_sig.computeSignature();
//import the document_element into dom_doc
  Element importedAssertionElement = (Element) 
dom_doc.importNode(domAssertionElem, true);
//use WSSecurity to append the secHeader and the importedAssertionElement into 
dom_doc
  WSSecurityUtil.appendChildElement(dom_doc, secHeader.getSecurityHeader(), 
importedAssertionElement);
//append the secHeader to secure_dk_sig
  secure_dk_sig.appendDKElementToHeader(secHeader);
//append the Signature
  secure_dk_sig.appendSigToHeader(secHeader);
//Display the SOAP 11 envelope
        System.out.println(soap11_envelope);
//
//
//        //Create a service client and send the request to 'ping' service 
(ping.aar)
     AxisService service = new AxisService("ping");
//      get the Ping Operation
  AxisOperation op = new OutInAxisOperation(new QName("Ping"));
//      add the ping operation to the service
  service.addChild(op);
//      create new ServiceClient from existing configurationContext
  ServiceClient client = new 
ServiceClient(ConfigurationContextFactory.createConfigurationContextFromFileSystem(Constants.TESTING_PATH
 + "rahas_client_repo", null), service);
//
//      new opClient this is what we'll use to set Endpoints
        OperationClient opClient = client.createClient(new QName("Ping"));
//      new MessageContext
        MessageContext mc = new MessageContext();
//      add the envelope to MessageContext
        mc.setEnvelope(envelope);
//  engage addressing Module
  client.engageModule(new QName("addressing"));
//      engage rampart security module
  client.engageModule(new QName("rampart"));
//add the MessageContext to the opClient
  opClient.addMessageContext(mc);
//secure site which conforms to OASIS
        opClient.getOptions().setTo(new 
EndpointReference("https://131.107.72.15/PingService/OasisScenario1";));
//    Regular secure site
  opClient.getOptions().setTo(new 
EndpointReference("https://207.200.37.116/Ping/Scenario1";));
//      set the action
  opClient.getOptions().setAction("http://example.org/Ping";);
//       set the Addressing Version
  opClient.getOptions().setProperty(AddressingConstants.WS_ADDRESSING_VERSION, 
AddressingConstants.Submission.WSA_NAMESPACE);
//this will execute the client and block opClient until we get a Message back
          opClient.execute(true);
//        get the MessageContext response
    MessageContext response = 
opClient.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
//        print out the envelope
   
System.out.println("------------------------------RESPONSE------------------------------\n"
 + response.getEnvelope());
    }
//

Martin Gainty 
______________________________________________ 
Jogi és Bizalmassági kinyilatkoztatás/Verzicht und 
Vertraulichkeitanmerkung/Note de déni et de confidentialité

 Ez az
üzenet bizalmas.  Ha nem ön az akinek szánva volt, akkor kérjük, hogy
jelentse azt nekünk vissza. Semmiféle továbbítása vagy másolatának
készítése nem megengedett.  Ez az üzenet csak ismeret cserét szolgál és
semmiféle jogi alkalmazhatósága sincs.  Mivel az electronikus üzenetek
könnyen megváltoztathatóak, ezért minket semmi felelöség nem terhelhet
ezen üzenet tartalma miatt.

Diese Nachricht ist vertraulich. Sollten Sie nicht der vorgesehene Empfaenger 
sein, so bitten wir hoeflich um eine Mitteilung. Jede unbefugte Weiterleitung 
oder Fertigung einer Kopie ist unzulaessig. Diese Nachricht dient lediglich dem 
Austausch von Informationen und entfaltet keine rechtliche Bindungswirkung. 
Aufgrund der leichten Manipulierbarkeit von E-Mails koennen wir keine Haftung 
fuer den Inhalt uebernehmen.
Ce message est confidentiel et peut être privilégié. Si vous n'êtes pas le 
destinataire prévu, nous te demandons avec bonté que pour satisfaire informez 
l'expéditeur. N'importe quelle diffusion non autorisée ou la copie de ceci est 
interdite. Ce message sert à l'information seulement et n'aura pas n'importe 
quel effet légalement obligatoire. Étant donné que les email peuvent facilement 
être sujets à la manipulation, nous ne pouvons accepter aucune responsabilité 
pour le contenu fourni.

 
Date: Wed, 15 May 2013 16:28:19 +0100
Subject: Re: Soap Envelope part signature verification
From: [email protected]
To: [email protected]

It doesn't make any sense to sign the entire SOAP Envelope. You typically sign 
the SOAP Body and a number of SOAP Headers such as WS-Addressing (if using), 
along with some specific security headers (Timestamp, UsernameToken, etc.).


Colm.

On Wed, May 15, 2013 at 4:03 PM, Oleg Korneychuk <[email protected]> wrote:

Hello,
I have created two tests. One of them signs Soap Body part and successfully 
verifies them. Another one signs Soap Envelope part and fails during 
verification.

Tests are identical at all except of WSEncryptionPart instances creation.


Please, advise me what I am doing wrong.Sources are attached.

Thank you.
Oleg Korneychuk.Java Developer.




---------------------------------------------------------------------

To unsubscribe, e-mail: [email protected]

For additional commands, e-mail: [email protected]


-- 
Colm O hEigeartaigh

Talend Community Coder
http://coders.talend.com


                                          

Reply via email to