Как изменить свойства соединения LDAP в LDAPCertStore для проверки цепочки сертификатов X509

Я пытаюсь проверить цепочку сертификатов 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: соединение закрыто]; оставшееся имя


person ichaki5748    schedule 23.09.2014    source источник
comment
Похоже, root: stackoverflow.com/questions/8787577/   -  person ichaki5748    schedule 23.09.2014


Ответы (1)


Исправлено в Java 9 — соединение LDAP восстанавливалось автоматически https://bugs.openjdk.java.net/browse/JDK-8059009

person ichaki5748    schedule 22.09.2015