Я пытаюсь проверить цепочку сертификатов X509 с помощью sun.security.validator.PKIXValidator в соответствии с Официальное руководство по Oracle. Одним из шагов проверки является проверка CRL. Я предоставляю LDAPCertStore для получения CRL от LDAP. Но LDAPCertStore не может обрабатывать закрытие соединения с сервером, потому что java.security.cert.LDAPCertStoreParameters
отсутствуют настройки для LDAPConnection.
Можно ли изменить свойства соединения LDAP, например. с помощью пула соединений LDAP (свойства системы не помогите, надувной замок имеет такую же реализацию в отношении соединений)? Пожалуйста, смотрите код для воспроизведения ниже:
@Test
public void testRevocationListValidation() throws Exception {
String trustStoreFile = "trustStoreFilePath";
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
InputStream is = getClass().getResourceAsStream(trustStoreFile);
if (is == null) {
throw new FileNotFoundException(String.format("KeyStore file '%s' is not found on classpath", trustStoreFile));
}
trustStore.load(is, "password".toCharArray());
Set<TrustAnchor> trustedAnchors = new HashSet<TrustAnchor>();
for (String caCertificateAlias : new String[]{"ca"}) {
X509Certificate certificate = (X509Certificate) trustStore.getCertificate(caCertificateAlias);
trustedAnchors.add(new TrustAnchor(certificate, null));
}
PKIXParameters parameters = new PKIXParameters(trustedAnchors);
CertStore certStore = CertStore.getInstance("LDAP", new LDAPCertStoreParameters("ldapHost", 389));
parameters.setCertStores(Collections.singletonList(certStore));
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(getClass().getResourceAsStream("keystore.jks"), "password".toCharArray());
String keyStoreAlias = "dev-test";
Certificate[] userCertificateChain = keyStore.getCertificateChain(keyStoreAlias);
for (int i = 0; i < 3; i++) {
System.out.println("Starting validation " + i);
CertPath userCertificatePath = CertificateFactory.getInstance("X.509").generateCertPath(Arrays.asList(userCertificateChain));
CertPathValidator.getInstance("PKIX").validate(userCertificatePath, parameters);
System.out.println("Validation " + i + " succeeded");
if (i == 1) {
System.out.println("Sleeping after second validation");
TimeUnit.SECONDS.sleep(90); // Server connection timeout ~ 60 sec
}
}
}
Пример вывода:
Начало проверки 0
Проверка 0 прошла успешно
Запуск проверки 1
Проверка 1 прошла успешно
Сон после второй проверки
Запуск проверки 2
java.security.cert.CertPathValidatorException: java.security.cert.CertStoreException: javax.naming.CommunicationException: соединение закрыто [Корневое исключение — java.io.IOException: соединение закрыто]; оставшееся имя