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

Уведомление

Icon
Error

2 Страницы<12
Опции
К последнему сообщению К первому непрочитанному
Offline Евгений Афанасьев  
#11 Оставлено : 20 февраля 2018 г. 14:25:42(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Может быть, вы в encodedRootCert передаете корневой, а не сертификат издателя сертификата cert (если цепочка сертификатов > 2) или чужой сертификат?
Теоретически, если у cert серийный номер 111, а вы передали encodedRootCert - сертификат Тестового УЦ, то может быть найден сертификат с номером 111 со статусом GOOD. Адрес OCSP службы, пожалуй, лучше брать из сертификата.

Отредактировано пользователем 20 февраля 2018 г. 14:28:03(UTC)  | Причина: Не указана

Offline Анатолий В.  
#12 Оставлено : 20 февраля 2018 г. 15:17:48(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, например. Как мне его достать из сертификата?

Подскажите, пожалуйста.
Offline Евгений Афанасьев  
#13 Оставлено : 20 февраля 2018 г. 16:14:22(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 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


Offline Анатолий В.  
#14 Оставлено : 20 февраля 2018 г. 18:36:15(UTC)
Анатолий В.

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

Группы: Участники
Зарегистрирован: 19.02.2018(UTC)
Сообщений: 9
Российская Федерация
Откуда: Москва

Автор: afev Перейти к цитате
Для этого можно построить цепочку.


1) Правильно ли я понимаю, что мне нужно получить сертификат издателя, то есть предыдущий сертификат в цепочке?
Возможны ситуации, что сертификат издателя и root-сертификат совпадут (если цепочка состоит из 2 сертификатов) - это нормально?

2)Я поискал примеры и везде вижу, что цепочку строят, имея доступ к KeyStore. У меня локально этих ключей нет. То есть ко мне с UI прилетает строка исходных данных и строка с открепленной подписью.
Из них я извлекаю клиентский сертификат.
Никаких сертификатов у меня нет, но нужно валидировать подпись и сертификат.

Проясните, пожалуйста, реальная ли задача получить из клиентского сертификата издательский?
Offline Андрей Писарев  
#15 Оставлено : 20 февраля 2018 г. 18:49:27(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,701
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2049 раз в 1589 постах
Цепочки возможны от 1 до нескольких сертификатов.

Обычно в клиентский сертификат добавляется URL,
по-которому можно получить сертификат издателя.
В случае с корневым сертификатом - нет.

Варианты:
а) требовать, чтобы были промежуточные сертификаты и корневые
б) реализовать самостоятельное получение\импорт сертификатов
Техническую поддержку оказываем тут
Наша база знаний
Offline Анатолий В.  
#16 Оставлено : 21 февраля 2018 г. 17:59:44(UTC)
Анатолий В.

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

Группы: Участники
Зарегистрирован: 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?
Спасибо.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы<12
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.