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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline wellusion  
#1 Оставлено : 26 ноября 2020 г. 16:15:19(UTC)
wellusion

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

Группы: Участники
Зарегистрирован: 16.11.2020(UTC)
Сообщений: 7

Сказал(а) «Спасибо»: 2 раз
Добрый день!

Выполняю верификацию подписи CAdES X Long Type 1.

При проверке из объекта ContentInfo (ru.CryptoPro.JCP.ASN.CryptographicMessageSyntax) сред прочего извлекаются атрибуты complete-revocation-references и complete-revocation-values.
В массиве references извлекаем idшники ocsp (OcspResponsesID). Вот в нём есть объект ResponderId, который должен содержать объект типа KeyHash(ru.CryptoPro.JCP.ASN.PKIXOCSP). Его значение извлекается и используется в дальнейшем для сравнения с аналогичным объектом из массива complete-revocation-values.
Так вот проблема в том, что вместо KeyHash лежит объект Name (ru.CryptoPro.JCP.ASN.PKIX1Explicit88), у которого в интерфейсе нет вот этого вот хэша.

Сам объект ContentInfo получается из массива байтов подписи. В скриншоте дебага видно, что уже сразу содержится объект Name.
Подпись валидна, ниже на скриншоте результат проверки через cpTools.

Код проекта достался в наследство, теоритически был рабочим, но гарантировать не могу.

Возможно, сможете что-то подсказать, какие-нибудь идеи, в чём может быть проблема?

Java: 1.8.0_211
JCP: jcp-2.0.40035
bouncycastle из дистрибутива: bcpkix-jdk15on-1.50.jar и bcprov-jdk15on-1.50.jar

verify.jpg (67kb) загружен 2 раз(а). debug-objects.jpg (138kb) загружен 3 раз(а).

Отредактировано пользователем 26 ноября 2020 г. 16:58:15(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#2 Оставлено : 26 ноября 2020 г. 19:38:31(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 550 раз в 525 постах
Здравствуйте.

Не очень понимаю вопрос. У ru.CryptoPro.JCP.ASN.PKIXOCSP.ResponderID в составе ANS1P.jar есть и KeyHash, и Name. Один из них обычно заполняется. В данном случае был заполнен Name.

Отредактировано пользователем 26 ноября 2020 г. 20:37:16(UTC)  | Причина: Не указана

Offline wellusion  
#3 Оставлено : 27 ноября 2020 г. 8:20:29(UTC)
wellusion

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

Группы: Участники
Зарегистрирован: 16.11.2020(UTC)
Сообщений: 7

Сказал(а) «Спасибо»: 2 раз
Да, видимо не очень ясно описал проблему. Код достался в наследство, в нём есть функционал валидации подписи cades-xlt1. Среди прочего он сравнивает значение поля value из типа keyHash атрибута из массива complete-revocation-references с аналогичным из complete-revocation-values.
Но при десериалиазции создаётся объект не KeyHash, а Name, в котором нет этого поля. Получаем экзепшн.
Код:

ResultOrErrors.fromNullable(ocspIdentifier.ocspResponderID, VerificationErrorType.OCSP_REF_RESPONDER_ID_IS_EMPTY)
     .nonNull(ocspResponderID -> (KeyHash) ocspResponderID.getElement(),
          VerificationErrorType.OCSP_REF_RESPONDER_KEY_HASH_IS_EMPTY)   
     .nonEmptyByteArray(keyHash -> keyHash.value, VerificationErrorType.OCSP_REF_RESPONDER_KEY_HASH_IS_EMPTY)
     .doWithResult(keyHashBytes -> rslt.responderKeySha1Bytes = keyHashBytes)

Сам созданный объект на скриншоте из дебага постом выше.

Может быть можно как то настроить, экземпляр какого класса использовать? По какой логике выбирается KeyHash или Name? Вообще, может быть вам очевидней, что я делаю не правильно или что сделано не так?

Отредактировано пользователем 27 ноября 2020 г. 8:29:32(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#4 Оставлено : 27 ноября 2020 г. 20:41:06(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 550 раз в 525 постах
В коде надо учитывать, что может быть как KeyHash, так и Name, т.к. в ResponderID они образуют choice. Если нет KeyHash, проверяйте по Name.
Offline wellusion  
#5 Оставлено : 30 ноября 2020 г. 8:27:43(UTC)
wellusion

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

Группы: Участники
Зарегистрирован: 16.11.2020(UTC)
Сообщений: 7

Сказал(а) «Спасибо»: 2 раз
А что именно по Name проверять? ElementName?
На скриншотах ниже - объект Name и результат метода getElementName()
getElementName
Name
Offline wellusion  
#6 Оставлено : 30 ноября 2020 г. 9:49:43(UTC)
wellusion

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

Группы: Участники
Зарегистрирован: 16.11.2020(UTC)
Сообщений: 7

Сказал(а) «Спасибо»: 2 раз
Или имеется ввиду проверять вот по этим параметрам субъекта:
http://prntscr.com/vsmky9
?

Отредактировано пользователем 30 ноября 2020 г. 9:50:58(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#7 Оставлено : 30 ноября 2020 г. 10:50:38(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 550 раз в 525 постах
По идее, приводите значение getElement() => element к KeyHash или Name в зависимости от getChoiceID() у element, затем проверяете либо по-старому, по KeyHash (т.е. по хешу открытого ключа сертификата), если он есть, либо по Name - по имени сертификата (subject name).
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
wellusion оставлено 30.11.2020(UTC)
Offline wellusion  
#8 Оставлено : 30 ноября 2020 г. 13:57:46(UTC)
wellusion

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

Группы: Участники
Зарегистрирован: 16.11.2020(UTC)
Сообщений: 7

Сказал(а) «Спасибо»: 2 раз
Только судя по интерфейсам, метод getChoiceID() с соответствующим полем есть только у Name:

Name -> Asn1Choice(здесь метод getChoiceID) -> Asn1Type
KeyHash -> Asn1OctetString -> Asn1Type

Наверно, стоит по типу объекта определять. Да и имени сертификата в Name нет, только набор полей субъекта. Наверно, commonName можно взять.

Отредактировано пользователем 30 ноября 2020 г. 14:01:00(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#9 Оставлено : 30 ноября 2020 г. 14:09:54(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 550 раз в 525 постах
У responderid choice. Да, набор полей name надо привести к виду x509name.

Отредактировано пользователем 30 ноября 2020 г. 14:10:45(UTC)  | Причина: Не указана

Offline wellusion  
#10 Оставлено : 30 ноября 2020 г. 14:36:54(UTC)
wellusion

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

Группы: Участники
Зарегистрирован: 16.11.2020(UTC)
Сообщений: 7

Сказал(а) «Спасибо»: 2 раз
Этот org.bouncycastle.asn1.x509.X509Name ?
Но его же нет в цепочке наследования: http://prntscr.com/vssoo5
Или я не понял, о чём речь.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.