in services/idp-core/src/main/java/org/apache/cxf/fediz/service/idp/beans/samlsso/AbstractSamlResponseCreator.java [78:146]
protected void signResponse(SignableSAMLObject signableObject, Idp idp) throws Exception {
if (!signLogoutResponse) {
return;
}
Crypto issuerCrypto = CertsUtils.getCryptoFromCertificate(idp.getCertificate());
X509Certificate[] issuerCerts = null;
String issuerKeyName = null;
if (issuerCrypto != null) {
CryptoType cryptoType = new CryptoType(CryptoType.TYPE.ALIAS);
issuerKeyName = issuerCrypto.getDefaultX509Identifier();
cryptoType.setAlias(issuerKeyName);
issuerCerts = issuerCrypto.getX509Certificates(cryptoType);
}
if (issuerCerts == null || issuerCerts.length == 0) {
throw new WSSecurityException(WSSecurityException.ErrorCode.FAILURE, "empty",
new Object[] {"No issuer certs were found to sign the SAML Assertion using issuer name: "
+ issuerKeyName});
}
String sigAlgo = SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA1;
String pubKeyAlgo = issuerCerts[0].getPublicKey().getAlgorithm();
LOG.debug("automatic sig algo detection: {}", pubKeyAlgo);
if ("DSA".equalsIgnoreCase(pubKeyAlgo)) {
sigAlgo = SignatureConstants.ALGO_ID_SIGNATURE_DSA;
} else if ("EC".equalsIgnoreCase(pubKeyAlgo)) {
sigAlgo = SignatureConstants.ALGO_ID_SIGNATURE_ECDSA_SHA1;
}
LOG.debug("Using Signature algorithm {}", sigAlgo);
PrivateKey privateKey;
try {
String issuerKeyPassword = idp.getCertificatePassword();
privateKey = issuerCrypto.getPrivateKey(issuerKeyName, issuerKeyPassword);
} catch (Exception ex) {
throw new WSSecurityException(WSSecurityException.ErrorCode.FAILURE, ex);
}
if (privateKey == null) {
throw new WSSecurityException(WSSecurityException.ErrorCode.FAILURE, "empty",
new Object[] {"No private key was found using issuer name: " + issuerKeyName});
}
Signature signature = OpenSAMLUtil.buildSignature();
signature.setCanonicalizationAlgorithm(SignatureConstants.ALGO_ID_C14N_EXCL_OMIT_COMMENTS);
signature.setSignatureAlgorithm(sigAlgo);
BasicX509Credential signingCredential =
new BasicX509Credential(issuerCerts[0], privateKey);
signature.setSigningCredential(signingCredential);
X509KeyInfoGeneratorFactory kiFactory = new X509KeyInfoGeneratorFactory();
kiFactory.setEmitEntityCertificate(true);
try {
KeyInfo keyInfo = kiFactory.newInstance().generate(signingCredential);
signature.setKeyInfo(keyInfo);
} catch (org.opensaml.security.SecurityException ex) {
throw new WSSecurityException(WSSecurityException.ErrorCode.FAILURE, ex, "empty",
new Object[] {"Error generating KeyInfo from signing credential"});
}
signableObject.setSignature(signature);
String digestAlg = SignatureConstants.ALGO_ID_DIGEST_SHA1;
SAMLObjectContentReference contentRef =
(SAMLObjectContentReference)signature.getContentReferences().get(0);
contentRef.setDigestAlgorithm(digestAlg);
signableObject.releaseDOM();
signableObject.releaseChildrenDOM(true);
}