Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline NogaevPN  
#1 Оставлено : 8 июля 2012 г. 20:43:21(UTC)
NogaevPN

Статус: Новичок

Группы: Участники
Зарегистрирован: 08.07.2012(UTC)
Сообщений: 2
Откуда: Астрахань

Добрый день, столкнулся с проблемой при построении цепочки сертификатов:

Exception in thread "main" sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
at java.security.cert.CertPathBuilder.build(Unknown Source)
at userSamples.Certificates.certificateChain(Certificates.java:177)
at userSamples.Certificates.main(Certificates.java:82)

Использовал немного модифицированный код из userSamples/Certificates

Код:

  // уникальное имя корневого сертификата
	    final String aliasRootCert = "rootCert";
	    // уникальное имя промежуточного сертификата
	    final String aliasInterCert = "intermediateCert";
	    // уникальное имя сертификата открытого ключа
	    final String aliasEndCert = "endCert";
		
	   //инициализация хранилища доверенных сертификатов и ключевого носителя
	    final KeyStore keyStore = KeyStore.getInstance("HDImageStore");

	    // загрузка содержимого хранилища (предполагается, что хранилище,
	    // проинициализированное именем STORE_TYPE существует) и содержимого
	    // ключевого носителя
	    keyStore.load(new FileInputStream("C:/certstore1"), "pass123".toCharArray());

	    // чтение корневого сертификата из хранилища доверенных сертификатов
	    // (предполагается, что такой сертификат существует в хранилище)
	    final Certificate certRoot = keyStore.getCertificate(aliasRootCert);
	    
	    // чтение промежуточного сертификата из хранилища доверенных сертификатов
	    // (предполагается, что такой сертификат существует в хранилище)
	    final Certificate certInter = keyStore.getCertificate(aliasInterCert);
	    
	    // чтение конечного сертификата (сертификата открытого ключа) с носителя
	    // (предполагается, что сертификат такой сертификат существует на носителе)
	    final Certificate certEnd = keyStore.getCertificate(aliasEndCert);
	    
	    //Построение цепочки из прочитанных сертификатов, начиная с корневого сертификата
	    //(с именем aliasRootCert) и заканчивая сертификатом открытого ключа (c именем aliasEndCert)

	    // определение списка сертификатов, из которых
	    // осуществляется построение цепочки
	    final List<Certificate> certs = new ArrayList<Certificate>(3);
	    certs.add(certRoot);
	    certs.add(certInter);
	    certs.add(certEnd);

	    // определение корневого сертификата (с которого начинается построение
	    // цепочки)
	    final TrustAnchor anchor =
	            new TrustAnchor((X509Certificate) certRoot, null);

	    // определение параметров специального хранилища
	    // сертификатов, в которое записываются все используемые
	    // в построении цепочки сертификаты
	    final CollectionCertStoreParameters par =
	            new CollectionCertStoreParameters(certs);

	    // создание специального хранилища сертификатов на основе
	    // параметров, определенных списком сертификатов
	    final CertStore store = CertStore.getInstance("Collection", par);

	    // инициализация объекта построения цепочки сертификатов
	    final CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX");
	    //или для совместимости с КриптоПро УЦ
	    //CertPathBuilder cpb = CertPathBuilder.getInstance("CPPKIX");

	    // инициализация параметров построения цепочки сертификатов
	    final PKIXBuilderParameters params = new PKIXBuilderParameters(
	            Collections.singleton(anchor), new X509CertSelector());

	    // добавление к параметрам сертификатов, из которых
	    // будет строиться цепочка
	    params.addCertStore(store);

	    // инициализация объекта выборки сертификата, которым
	    // заканчивается построение цепочки
	    final X509CertSelector selector = new X509CertSelector();

	    // определение сертификата, которым
	    // заканчивается построение цепочки
	    selector.setCertificate((X509Certificate) certEnd);

	    params.setTargetCertConstraints(selector);

	    // построение цепочки сертификатов
	    final PKIXCertPathBuilderResult res =
	            (PKIXCertPathBuilderResult) cpb.build(params);

	    /* Проверка построенной цепочки сертификатов */

	    // инициализация объекта проверки цепочки сертификатов
	    final CertPathValidator validator = CertPathValidator.getInstance("PKIX");
	    //или для совместимости с КриптоПро УЦ
	    //CertPathValidator validator = CertPathValidator.getInstance("CPPKIX");

	    // проверка цепочки сертификатов
	    final CertPathValidatorResult val_res =
	            validator.validate(res.getCertPath(), params);

	    // вывод результата проверки в строком виде
	    System.out.println(val_res.toString());



Хранилище сертификатов создавал через контрольную панель JCP, из контрольной панели цепочка создается нормально.
Прошу вас подсказать в какую сторону копать, для решения данной проблемы.

Отредактировано пользователем 8 июля 2012 г. 20:45:03(UTC)  | Причина: Не указана

Вложение(я):
certstore1 (3kb) загружен 10 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Евгений Афанасьев  
#2 Оставлено : 9 июля 2012 г. 0:23:07(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,030
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 729 раз в 687 постах
Здравствуйте.
1) до
Код:
cpb.build(params)
попробуйте поставить
Код:

params.setSigProvider("JCP");
params.setRevocationEnabled(false);

2) после
Код:
cpb.build(params)
и, соответственно, до
Код:
validator.validate(res.getCertPath(), params)
можно поставить
Код:

params.setRevocationEnabled(true);

а также
Код:

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

По поводу последнего параметра можете посмотреть пример userSamples/OCSPValidateCert.
Мне, правда, не удалось проверить цепочку согласно ссылкам на CRL в сертификатах, т.е. validate не прошел.

Отредактировано пользователем 9 июля 2012 г. 0:24:54(UTC)  | Причина: Не указана

Offline NogaevPN  
#3 Оставлено : 9 июля 2012 г. 23:44:13(UTC)
NogaevPN

Статус: Новичок

Группы: Участники
Зарегистрирован: 08.07.2012(UTC)
Сообщений: 2
Откуда: Астрахань

Спасибо за дельный совет, первый вариант помог, CRL собираюсь скачивать по расписанию и проверять локально для увеличения производительности.
Offline Евгений Афанасьев  
#4 Оставлено : 10 июля 2012 г. 19:55:19(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,030
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 729 раз в 687 постах
На счет проверки по crl - забыл упомянуть про необходимость:
Код:

System.setProperty("com.sun.security.enableCRLDP", "true");
System.setProperty("com.ibm.security.enableCRLDP", "true");

Это есть в том же примере userSamples/OCSPValidateCert.
По crl цепочка ваших сертификатов проверяется.
Соответственно, для проверки по ocsp указываем Security.setProperty("ocsp.enable", "true"); и остальные необходимые параметры.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.