Я реализую SAML SP в Java.
Чтобы проверить сертификат ответа SAML,
Я извлекаю элемент X509Certificate из ответа SAML и проверяю его на файл хранилища ключей Java, который я предварительно загрузил сертификат IDP.
Я использую следующий код для проверки сертификата:
Подтвердить путь сертификации
X509Certificate certFromResponse = //extract from SAML response
KeyStore keyStore = getKS();
PKIXParameters params = new PKIXParameters(keyStore);
params.setRevocationEnabled(false);
CertPath certPath =
certificateFactory.generateCertPath(Arrays.asList(certFromResponse));
CertPathValidator certPathValidator = CertPathValidator.getInstance(CertPathValidator.getDefaultType());
CertPathValidatorResult result = certPathValidator.validate(certPath, params);
Это прекрасно работает для сертификатов, которые являются корневой CA.
Когда сертификат имеет путь сертификации, проверка не выполняется.
Возможный способ справиться с это вручную загрузить все сертификаты на пути в JKS файл
с различными псевдонимами, а затем извлечь их в список, как это:
List<Certificate> certs = new ArrayList<Certificate>();
certs.add(certFromResponse);
if (keyStore.getCertificate("ALIAS_CA_1") != null) {
certs.add(keyStore.getCertificate("ALIAS_CA_1"));
}
if (keyStore.getCertificate("ALIAS_CA_2") != null) {
certs.add(keyStore.getCertificate("ALIAS_CA_2");
}
...
CertPath certPath = certificateFactory.generateCertPath(certs);
Есть ли более простой способ сделать это?
Можно ли извлечь сертификационный путь из самого сертификата?
Спасибо!