in modules/rampart-core/src/main/java/org/apache/rampart/PolicyBasedResultsValidator.java [833:922]
protected boolean isCertificateTrusted(
X509Certificate cert,
Crypto crypto
) throws RampartException {
String subjectString = cert.getSubjectX500Principal().getName();
String issuerString = cert.getIssuerX500Principal().getName();
BigInteger issuerSerial = cert.getSerialNumber();
if (log.isDebugEnabled()) {
log.debug("Transmitted certificate has subject " + subjectString);
log.debug(
"Transmitted certificate has issuer " + issuerString + " (serial "
+ issuerSerial + ")"
);
}
//
// FIRST step - Search the keystore for the transmitted certificate
//
if (isCertificateInKeyStore(crypto, cert)) {
return true;
}
//
// SECOND step - Search for the issuer cert (chain) of the transmitted certificate in the
// keystore or the truststore
//
CryptoType cryptoType = new CryptoType(CryptoType.TYPE.SUBJECT_DN);
cryptoType.setSubjectDN(issuerString);
X509Certificate[] foundCerts = new X509Certificate[0];
try {
foundCerts = crypto.getX509Certificates(cryptoType);
} catch (WSSecurityException e) {
throw new RampartException("noCertForSubject", e);
}
// If the certs have not been found, the issuer is not in the keystore/truststore
// As a direct result, do not trust the transmitted certificate
if (foundCerts == null || foundCerts.length < 1) {
if (log.isDebugEnabled()) {
log.debug(
"No certs found in keystore for issuer " + issuerString
+ " of certificate for " + subjectString
);
}
return false;
}
//
// THIRD step
// Check the certificate trust path for the issuer cert chain
//
if (log.isDebugEnabled()) {
log.debug(
"Preparing to validate certificate path for issuer " + issuerString
);
}
//
// Form a certificate chain from the transmitted certificate
// and the certificate(s) of the issuer from the keystore/truststore
//
X509Certificate[] x509certs = new X509Certificate[foundCerts.length + 1];
x509certs[0] = cert;
for (int j = 0; j < foundCerts.length; j++) {
x509certs[j + 1] = (X509Certificate)foundCerts[j];
}
//
// Use the validation method from the crypto to check whether the subjects'
// certificate was really signed by the issuer stated in the certificate
//
// TODO we need to configure enable revocation ...
try {
crypto.verifyTrust(x509certs, false, null, null);
if (log.isDebugEnabled()) {
log.debug(
"Certificate path has been verified for certificate with subject "
+ subjectString
);
}
return true;
} catch (WSSecurityException e) {
log.error(
"Certificate path could not be verified for certificate with subject "
+ subjectString
);
throw new RampartException("certPathVerificationFailed", e);
}
}