Статус: Новичок
Группы: Участники
Зарегистрирован: 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 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,030  Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 729 раз в 687 постах
|
Здравствуйте. 1) до попробуйте поставить Код:
params.setSigProvider("JCP");
params.setRevocationEnabled(false);
2) после и, соответственно, до Код:validator.validate(res.getCertPath(), params)
можно поставить Код:
params.setRevocationEnabled(true);
а также Код:
Security.setProperty("ocsp.enable", "true");
По поводу последнего параметра можете посмотреть пример userSamples/OCSPValidateCert. Мне, правда, не удалось проверить цепочку согласно ссылкам на CRL в сертификатах, т.е. validate не прошел. Отредактировано пользователем 9 июля 2012 г. 0:24:54(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 08.07.2012(UTC) Сообщений: 2 Откуда: Астрахань
|
Спасибо за дельный совет, первый вариант помог, CRL собираюсь скачивать по расписанию и проверять локально для увеличения производительности.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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"); и остальные необходимые параметры. |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close