Проверка сертификата x509 сертификата - PullRequest
2 голосов
/ 08 марта 2011

Наш вариант использования требует проверки отзыва сертификата через OCSP при настройке PKIX. Моей отправной точкой был код в этом связанном вопросе: Отзыв OCSP на клиентском сертификате

Я делаю это вручную на уровне приложения, поскольку tomcat не поддерживает это. Однако у меня возникли некоторые проблемы при создании certPath, и я думаю, что мне не хватает фундаментального понимания.

Сначала я пытаюсь создать certPath для входящего клиента x509Certificate.

Хранилище ключей правильно инициализировано и содержит только корневые сертификаты, соответствующие клиентскому сертификату x509.

РЕДАКТИРОВАТЬ: Я получил тот же результат после добавления промежуточных сертификатов.

X509CertSelector certSelector = new X509CertSelector();
certSelector.setSubject(x509certificate.getSubjectX500Principal());
PKIXParameters params = new PKIXBuilderParameters(store,certSelector);
CertPathBuilder cpb = CertPathBuilder.getInstance(CertPathBuilder.getDefaultType());
CertPath certPath = cpb.build(params).getCertPath();

Однако я получаю сообщение об ошибке во время выполнения:

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Чего не хватает?

Ответы [ 2 ]

3 голосов
/ 18 марта 2011

Вы указываете, что вы добавили промежуточные сертификаты.Так как вы не обновили свой фрагмент кода, мне было интересно, как добавлены эти сертификаты?Вы должны добавить эти сертификаты как CertStore

X509CertSelector certSelector = new X509CertSelector();
certSelector.setSubject(x509certificate.getSubjectX500Principal());
PKIXParameters params = new PKIXBuilderParameters(store,certSelector);
CertStore cstore = CertStore.getInstance("Collection", new CollectionCertStoreParameters(Arrays.asList(icert1, icert2 /*, other certs... */)));
params.addCertStore(cstore);
CertPathBuilder cpb = CertPathBuilder.getInstance(CertPathBuilder.getDefaultType());
CertPath certPath = cpb.build(params).getCertPath();
3 голосов
/ 09 марта 2011

Как у вас есть, я не уверен, как CPB найдет сертификат субъекта (x509certificate) для построения пути, если он не находится в вашем хранилище ключей, чего обычно не было бы.Простого предоставления имени субъекта недостаточно для создания проверенного пути;Алгоритм обнаружения и проверки требует полного предметного сертификата.Посмотрите, что произойдет, если вы замените

certSelector.setSubject(x509certificate.getSubjectX500Principal());

на

certSelector.setCertificate(x509certificate);
...