2016-07-11 13 views
1

В настоящее время я пишу сетевой TCP-сервер с использованием SSL. В производстве мы, наконец, потребуем от клиентов аутентификации с сертификатом.Проверка SSL-сертификата Java Проверка

Чтобы отозвать сертификаты в случае возникновения чрезвычайной ситуации, мы также хотели бы установить CRL.

Мой вопрос: Является ли Java проверять CRL (если имеется сертификат) из коробки или мне нужно вручную выполнить такие проверки?

Для тестирования я подготовил сертификат с набором CRL, но Java, похоже, не пытается его проверить (я удалил его на локальный веб-сервер, и нет доступа).

Я нашел только com.sun.net.ssl.checkRevocation = true VM вариант, но, по-видимому, он не запрашивает CRL. VM отладки установлен java.security.debug = CertPath не формирует никаких выходных данных, либо ...

Java, кажется, связаны классы в ее подсистем (например, java.security.cert.X509CRLSelector), но очевидно, это не вступает в игру.

Я написал проект небольшой Maven стиля с использованием Apache Mina, как клиент-сервер, который инициализирует SSLContext на основе ключевого/truststores и самоподписанные сертификаты для клиента/сервера, который можно скачать здесь, как ZIP архив: https://www.dropbox.com/s/3fqmd1v9mn2a5ve/ssltest.zip?dl=0

+0

по умолчанию java не проверяет CRL, если вам нужно, вам нужно создать собственный валидатор сертификатов. –

+0

Это может помочь вам https://www.java.com/en/download/help/revocation_options.xml –

+0

Возможный дубликат [CRL Verification in Java] (http://stackoverflow.com/questions/30903993/crl-verification -in-java) –

ответ

7

Я понял, как включить проверку CRL в SSLContext без реализации пользовательского валидатора, как это предлагается в комментариях.

В основном, это правильная инициализация TrustManagers SSLContext с помощью проверки отзыва, только несколько строк, не пользовательская логика проверки, а CRL теперь проверяется автоматически, а также путь проверки.

Вот отрывок ...

KeyStore ts = KeyStore.getInstance("JKS"); 
FileInputStream tfis = new FileInputStream(trustStorePath); 
ts.load(tfis, trustStorePass.toCharArray()); 

KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 

// initialize certification path checking for the offered certificates and revocation checks against CLRs 
CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX"); 
PKIXRevocationChecker rc = (PKIXRevocationChecker)cpb.getRevocationChecker(); 
rc.setOptions(EnumSet.of(
    PKIXRevocationChecker.Option.PREFER_CRLS, // prefer CLR over OCSP 
    PKIXRevocationChecker.Option.ONLY_END_ENTITY, 
    PKIXRevocationChecker.Option.SOFT_FAIL, // handshake should not fail when CRL is not available 
PKIXRevocationChecker.Option.NO_FALLBACK)); // don't fall back to OCSP checking 

PKIXBuilderParameters pkixParams = new PKIXBuilderParameters(ts, new X509CertSelector()); 
pkixParams.addCertPathChecker(rc); 

tmf.init(new CertPathTrustManagerParameters(pkixParams)); 
// init KeyManagerFactory 
kmf.init(...) 

SSLContext ctx = SSLContext.getInstance("TLS"); 
ctx.init(kmf.getKeyManagers), tmf.getTrustManagers(), null); 

Это по существу сделал то, что мне нужно в приложении, проверяя, является ли сертификат, выданный клиенту отозвана в нашем CRL. Только проверка конечного объекта и допущение сбоя проверки CRL принимаются из-за всей нашей инфраструктуры.

+0

Эй, есть ли аналогичное решение для java 1.7? – mdavid

+0

@mdavid: Извините, я отказался дать вам этот ответ пару раз, но, возможно, вам стоит просто попробовать Java 8 (через 3 года после выпуска?). В стеке безопасности было много улучшений: http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html Поскольку _PKIXRevocationChecker _ даже упоминается в журнале изменений , Я предполагаю, что нет никакого готового решения для проверки сертификатов в 1.7. – DoNuT

+0

Привет @DoNuT, он позаботится о получении CRL из удаленного места (предоставляется в сертификате) и кэширования его до следующего времени обновления? А затем снова получить новый CRL? Заранее спасибо. – ramtech