public void signObject(SignableSAMLObject signable, SimpleKey key, AlgorithmMethod algorithm, DigestMethod digest) { KeyStoreCredentialResolver resolver = getCredentialsResolver(key); Credential credential = getCredential(key, resolver); XMLObjectBuilder<org.opensaml.xmlsec.signature.Signature> signatureBuilder = (XMLObjectBuilder<org.opensaml.xmlsec.signature.Signature>) getBuilderFactory() .getBuilder(org.opensaml.xmlsec.signature.Signature.DEFAULT_ELEMENT_NAME); org.opensaml.xmlsec.signature.Signature signature = signatureBuilder.buildObject(org.opensaml.xmlsec .signature.Signature.DEFAULT_ELEMENT_NAME); signable.setSignature(signature); SignatureSigningParameters parameters = new SignatureSigningParameters(); parameters.setSigningCredential(credential); parameters.setKeyInfoGenerator(getKeyInfoGenerator(credential)); parameters.setSignatureAlgorithm(algorithm.toString()); parameters.setSignatureReferenceDigestMethod(digest.toString()); parameters.setSignatureCanonicalizationAlgorithm( CanonicalizationMethod.ALGO_ID_C14N_EXCL_OMIT_COMMENTS.toString() ); try { SignatureSupport.prepareSignatureParams(signature, parameters); Marshaller marshaller = XMLObjectProviderRegistrySupport.getMarshallerFactory().getMarshaller(signable); marshaller.marshall(signable); Signer.signObject(signature); } catch (SecurityException | MarshallingException | SignatureException e) { throw new SamlKeyException(e); } }