Включить проверку отзыва сертификатов SSL в OpenJDK 11 - PullRequest
1 голос
/ 25 марта 2019

Есть ли какой-нибудь быстрый «декларативный» способ в Java 11 вместо утомительной ручной реализации, позволяющий проверять, отозван ли сертификат?

Я пытался использовать свойства из этого ответа: Проверка статуса отзыва сертификата X509 в Spring-Security перед аутентификацией с этим фиктивным отозванным сертификатом: https://revoked.badssl.com но код всегда принимает сертификат. Я делаю что-то не так или эти свойства больше не актуальны для Java 11? Если да, есть ли у нас альтернативы?

Ниже мой код:

public static void validateOnCertificateRevocation(boolean check) {
    if (check) {
        System.setProperty("com.sun.net.ssl.checkRevocation", "true");
        System.setProperty("com.sun.security.enableCRLDP", "true");

        Security.setProperty("ocsp.enable", "true");
    }

    try {
        new URL("https://revoked.badssl.com").openConnection().connect();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

1 Ответ

2 голосов
/ 26 марта 2019

Похоже, что эти опции должны быть установлены до того, как будет выполнен первый запрос.

Поэтому следующий код в качестве отдельной Java-программы выдает CertPathValidatorException: Certificate has been revoked (протестировано с использованием OpenJDK 11.0.2 x64 в Windows):

public static void main(String[] args) {
    validateOnCertificateRevocation(true); // throws CertPathValidatorException
}

Однако следующий код не вызывает никаких ошибок / исключений:

public static void main(String[] args) {
    validateOnCertificateRevocation(false);
    validateOnCertificateRevocation(true); // nothing happens
}

Вы видите, что изменение параметров после обработки первого запроса неэффективно. Я предполагаю, что эти параметры обрабатываются в блоке static { ... } некоторого класса, связанного с проверкой сертификата.

Если вы все еще хотите включить / отключить проверку отзыва сертификатов для каждого запроса, вы можете сделать это, внедрив свой собственный X509TrustManager, который использует CertPathValidator (для который вы можете включить / отключить проверку отзыва сертификатов через PKIXParameters.setRevocationEnabled(boolean).

В качестве альтернативы существует решение для глобальной проверки проверки отзыва сертификатов и явной обработки исключения CertificateRevokedException:

private boolean checkOnCertificateRevocation;

@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
    try {
        getDefaultTrustManager().checkServerTrusted(certs, authType);
    } catch (CertificateException e) {
        if (checkOnCertificateRevocation) {
            if (getRootCause(e) instanceof CertificateRevokedException) {
                throw e;
            }
        }
    }
}
...