protected XMLSignatureFactory createXMLSignatureFactory() { // Získání XMLSignatureFactory, která je základní třídou // realizující XML podpis. Název použité implementace je "DOM" // XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM"); XMLSignatureFactory fac = null; try { String providerName = getProvideName(); Provider p = (Provider) Class.forName(providerName).newInstance(); fac = XMLSignatureFactory.getInstance("DOM", p); } catch (Exception e) { handleException(e); fac = XMLSignatureFactory.getInstance("DOM"); } return fac; } public void SOAPSignate(SOAPMessage message) { try { XMLSignatureFactory fac = createXmlSignatureFactory(); // Vytvoření elementu KeyInfo final KeyInfoFactory kif = fac.getKeyInfoFactory(); // Seznam všech dětských elementů elementu KeyInfo final List keyInfoList = new ArrayList(); SOAPFactory fa = getSoapFactory(); 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"); List prefix = Collections.synchronizedList(new ArrayList()); prefix.add("soap"); C14NMethodParameterSpec cn = new ExcC14NParameterSpec(prefix); 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 Transform t2 = fac.newTransform(CanonicalizationMethod.EXCLUSIVE, (TransformParameterSpec) null); Reference reference = fac.newReference("#" + getBodyNodeId(), fac.newDigestMethod(DigestMethod.SHA256, null), Collections.singletonList(t2), null, null); final SignedInfo signedInfo = fac.newSignedInfo(canonicalizationMethod, signatureMethod, Collections.singletonList(reference)); // Vytvoření elementu XMLSignature XMLSignature xmlSignature = fac.newXMLSignature(signedInfo, keyInfo, null, getSignatureName(), null); // Podepsání dokumentu final DOMSignContext domSignContext = new DOMSignContext(getKey(), message.getSOAPHeader().getFirstChild()); domSignContext.putNamespacePrefix(XMLSignature.XMLNS, "ds"); domSignContext.putNamespacePrefix("http://www.w3.org/2001/10/xml-exc-c14n#", "ec"); xmlSignature.sign(domSignContext); message.saveChanges(); } catch (Exception e) { handleException(e); } }