2015-06-17 8 views
0

У меня есть CRL и самозаверяющий сертификат, который действует как сертификат CA. Мне нужно проверить, что тот же СА выпустил как CRL, так и корневой сертификат на Java. Так я думал это было:Проверка CRL на Java

X500Principal rootCertIssuer = rootCertificate.getIssuerX500Principal(); 
X500Principal crlIssuer = crl.getIssuerX500Principal(); 
    if(rootCertIssuer.getName().equals(crlIssuer.getName())) 
    System.out.println("Issuer same!"); 
else 
    System.out.println("Issuer different!"); 

Это не кажется правильным, потому что в случае, если страна/Государственная информация отсутствует в одном либо в CRL или сертификата корневого equals() возвратит false. Как я могу продолжить? Или, против того, что я думаю, это такой подход?

Спасибо!

ответ

1

Как было упомянуто @frasertweedale, эмитент сертификатов и эмитент CRL необязательно должны быть одинаковыми. Несмотря на это, нет никаких оснований делегировать выдачу CRL другому органу, а не всем системам поддержки. Например, код проверки подлинности цепочки Windows поддерживает только CRL, выданные (подписанные) тем же СА, которые выдали сертификат, охватываемый CRL.

В общем, логика проверки состоит из двух частей и выглядит следующим образом:

  1. расширение Read CDP (CRL Distribution Points) сертификата (некорневой) и петля над CRLDistributionPoints последовательности. Если есть запись с представленной структурой cRLIssuer, то CRL, на который ссылается эта точка распространения, подписывается сущностью, указанной в поле cRLIssuer. Если поле cRLIssuer не представлено, то сертификат и CRL подписываются одним и тем же центром сертификации, а местоположение CRL указывается в поле distributionPointName.
  2. Скачайте (или используйте другие средства для скачивания CRL) CRL (и сертификат сертификата CRL, если необходимо) и запустите процедуру проверки CRL.

CRL проверки в отношении эмитента осуществляется в два этапа:

  1. первое, что вам нужно сделать бинарный (не строка) сравнение Issuer поданную в CRL и Subject поле сертификата эмитента CRL. Если сравнение не выполнено, CRL недействителен.
  2. использовать открытый ключ сертификата эмитента CRL для проверки подписи CRL. Если проверка подписи не удалась, CRL недействителен.

больше информации о составе и обработке расширения точки распространения CRL правил: RFC 5280 §4.2.1.13

0

Если отличительные имена эмитента различаются по сертификату ЦС и CRL, то они ДОЛЖНЫ считаться выпущенными разными эмитентами. Если биты DN эмитента «пропадают» при создании CRL или любого другого подписанного объекта, то есть это нарушение X.509 и ошибка.

Обратите внимание, что СА может делегат CRL подписи подчиненного CRL эмитент, поэтому общей функция проверки CRL должен обрабатывать этот случай, а также прямую выдачу CRL.

0

Просто отметить, что с Java8 есть способ проверки цепи сертификатов, включая CRL проверки, смотрите здесь: Java SSL Certificate Revocation Checking.

Если вы используете самозаверяющие сертификаты, вам действительно нужно убедиться, что ваши хранилища ключей/доверенных лиц задействованы правильно (по умолчанию cacerts).

Я думаю, строка сравнения имен проблем - довольно слабый подход.

Смежные вопросы