Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,925 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 691 раз в 652 постах
|
Может быть, вы в encodedRootCert передаете корневой, а не сертификат издателя сертификата cert (если цепочка сертификатов > 2) или чужой сертификат? Теоретически, если у cert серийный номер 111, а вы передали encodedRootCert - сертификат Тестового УЦ, то может быть найден сертификат с номером 111 со статусом GOOD. Адрес OCSP службы, пожалуй, лучше брать из сертификата. Отредактировано пользователем 20 февраля 2018 г. 14:28:03(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 19.02.2018(UTC) Сообщений: 9 Откуда: Москва
|
Автор: afev Может быть, вы в encodedRootCert передаете корневой, а не сертификат издателя сертификата cert (если цепочка сертификатов > 2) или чужой сертификат? Код:CertificateFactory certificateFactory = CertificateFactory.getInstance("X509");
byte[] encodedRootCert = GostCertificateRequest.getEncodedRootCert("http://www.cryptopro.ru/certsrv/");
X509Certificate issuer = (X509Certificate) certificateFactory
.generateCertificate(new ByteArrayInputStream(encodedRootCert));
Вот так я формирую корневой сертификат (Это ведь корневой сертификат?). Как мне получить сертификат издателя сертификата cert? Я исследовал код в samples-sources, но не смог там этого найти. Автор: afev Адрес OCSP службы, пожалуй, лучше брать из сертификата. Да, и с этим проблемы. Я не вижу метод наподобие getOcspAddress у класса X509Certificate, например. Как мне его достать из сертификата? Подскажите, пожалуйста.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,925 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 691 раз в 652 постах
|
Автор: Анатолий В. Вот так я формирую корневой сертификат (Это ведь корневой сертификат?). Как мне получить сертификат издателя сертификата cert? Корневой может не быть сертификатом издателя, могут быть промежуточные сертификаты. Для этого можно построить цепочку. Автор: Анатолий В. Я не вижу метод наподобие getOcspAddress у класса X509Certificate, например. Как мне его достать из сертификата?
Адреса в расширениях, их нужно декодировать, допустим: Код:
X509Certificate cert = (X509Certificate) CertificateFactory.getInstance("X.509")
.generateCertificate(new FileInputStream("cert.cer"));
Asn1BerDecodeBuffer buffer = new Asn1BerDecodeBuffer(cert.getEncoded());
Certificate certAsn = new Certificate();
certAsn.decode(buffer);
Extensions extensions = certAsn.tbsCertificate.extensions;
final int[] caIssuer = {1, 3, 6, 1, 5, 5, 7, 1, 1};
final int[] ocspExtensionOid = {1, 3, 6, 1, 5, 5, 7, 48, 1};
List<String> urls = new ArrayList<>(2);
for (Extension extension : extensions.elements) {
if (Arrays.equals(extension.extnID.value, caIssuer)) {
buffer.reset();
buffer = new Asn1BerDecodeBuffer(extension.extnValue.value);
AuthorityInfoAccessSyntax accessSyntax = new AuthorityInfoAccessSyntax();
accessSyntax.decode(buffer);
for (AccessDescription accessDescription : accessSyntax.elements) {
if (Arrays.equals(accessDescription.accessMethod.value, ocspExtensionOid)) {
if (accessDescription.accessLocation.getChoiceID() == GeneralName._UNIFORMRESOURCEIDENTIFIER) { // URL
Asn1IA5String name = (Asn1IA5String) accessDescription.accessLocation.getElement();
urls.add(name.value);
} // if
} // if
} // for
} // if
} // for
System.out.println("%%% URLs %%%");
for (String url : urls) {
System.out.println(url);
} // for
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 19.02.2018(UTC) Сообщений: 9 Откуда: Москва
|
Автор: afev Для этого можно построить цепочку. 1) Правильно ли я понимаю, что мне нужно получить сертификат издателя, то есть предыдущий сертификат в цепочке? Возможны ситуации, что сертификат издателя и root-сертификат совпадут (если цепочка состоит из 2 сертификатов) - это нормально? 2)Я поискал примеры и везде вижу, что цепочку строят, имея доступ к KeyStore. У меня локально этих ключей нет. То есть ко мне с UI прилетает строка исходных данных и строка с открепленной подписью. Из них я извлекаю клиентский сертификат. Никаких сертификатов у меня нет, но нужно валидировать подпись и сертификат. Проясните, пожалуйста, реальная ли задача получить из клиентского сертификата издательский?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,701 Сказал «Спасибо»: 500 раз Поблагодарили: 2049 раз в 1589 постах
|
Цепочки возможны от 1 до нескольких сертификатов.
Обычно в клиентский сертификат добавляется URL, по-которому можно получить сертификат издателя. В случае с корневым сертификатом - нет.
Варианты: а) требовать, чтобы были промежуточные сертификаты и корневые б) реализовать самостоятельное получение\импорт сертификатов |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 19.02.2018(UTC) Сообщений: 9 Откуда: Москва
|
Спасибо большое за помощь. Проверка проходит. Вопрос есть. Автор: afev Код:
List<String> urls = new ArrayList<>(2);
<...>
urls.add(name.value);
<...>
for (String url : urls) {
System.out.println(url);
}
Я вижу, что у некоторых сертификатов есть два значения поля {1, 3, 6, 1, 5, 5, 7, 48, 1}. Правильно ли я понимаю, что для данного сертификата существует два OCSP-проверочных URL'а? Какое действует правило? Производить проверку по обоим, т.к. первый вернет UNKNOWN, а второй вернет GOOD, например? Или есть строгое правило, что оба вернут GOOD? Спасибо.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close