import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.xml.crypto.XMLStructure; import javax.xml.crypto.dom.DOMStructure; import javax.xml.crypto.dsig.CanonicalizationMethod; import javax.xml.crypto.dsig.DigestMethod; import javax.xml.crypto.dsig.Reference; import javax.xml.crypto.dsig.SignatureMethod; import javax.xml.crypto.dsig.SignedInfo; import javax.xml.crypto.dsig.Transform; import javax.xml.crypto.dsig.XMLSignature; import javax.xml.crypto.dsig.XMLSignatureFactory; import javax.xml.crypto.dsig.dom.DOMSignContext; import javax.xml.crypto.dsig.keyinfo.KeyInfo; import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory; import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec; import javax.xml.crypto.dsig.spec.ExcC14NParameterSpec; import javax.xml.crypto.dsig.spec.SignatureMethodParameterSpec; import javax.xml.crypto.dsig.spec.TransformParameterSpec; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPFactory; import javax.xml.soap.SOAPMessage; XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM"); // Vytvoření elementu KeyInfo final KeyInfoFactory kif = fac.getKeyInfoFactory(); final List keyInfoList = new ArrayList(); SOAPFactory fa = SOAPFactory.newInstance(); SOAPElement tokenreference = fa.createElement(createWsseName("SecurityTokenReference")); SOAPElement refx = tokenreference.addChildElement(createWsseName("Reference")); refx.setAttribute("URI", "#TheCert"); refx.setAttribute("ValueType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"); tokenreference.setAttribute("wsu:Id", "TheSecurityTokenReference"); keyInfoList.add(new DOMStructure(tokenreference)); // Vytvoření elementu KeyInfo final KeyInfo keyInfo = kif.newKeyInfo(keyInfoList, "TheKeyInfo"); Transform t2 = fac.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null); Transform t1 = fac.newTransform("http://www.w3.org/2001/10/xml-exc-c14n#", (TransformParameterSpec) null); // Kanonizační metoda ArrayList prefixList = new ArrayList(); prefixList.add("soap"); C14NMethodParameterSpec cn = new ExcC14NParameterSpec(prefixList); final CanonicalizationMethod canonicalizationMethod = fac .newCanonicalizationMethod(CanonicalizationMethod.EXCLUSIVE, cn); // Algoritmus podpisu "SHA256withRSA" SignatureMethod signatureMethod = fac.newSignatureMethod( "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256", (SignatureMethodParameterSpec) null); // Vytvoření elementu SignedInfo Reference reference = fac.newReference("#" + getBodyNodeId(), fac.newDigestMethod(DigestMethod.SHA256, null), Collections.singletonList(t1), null, null); final SignedInfo signedInfo = fac.newSignedInfo(canonicalizationMethod, signatureMethod, Collections.singletonList(reference)); // Vytvoření elementu XMLSignature XMLSignature xmlSignature = fac.newXMLSignature(signedInfo, keyInfo, null, "TheSignature", null); // Podepsání dokumentu final DOMSignContext domSignContext = new DOMSignContext(getKey(), message.getSOAPHeader().getFirstChild()); domSignContext.putNamespacePrefix(XMLSignature.XMLNS, "ds"); xmlSignature.sign(domSignContext); } catch (Exception e) { handleException(e); } }