logo
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Gennady  
#1 Оставлено : 9 января 2018 г. 13:28:13(UTC)
Gennady

Статус: Участник

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

Доброго дня.
Для одного из наших заказчиков делаем подписание документов ЭП. Используем для подписания библиотеку JCP 2.0. У Заказчика поднят свой УЦ на продукте DSS.
Для подписания и верификации подписей используем механизм SOAP.
С подписанием документов проблем не возникло. Все подписывается и возвращается (подписываем отсоединенной подписью).
Подпись проверили вручную с использованием вашего инструмента
https://dss.cryptopro.ru/Frontend/Verify
Далее мы начали встраивать проверку подписи в нашем собственном веб-приложении. Мы установили в JRE библиотеку JCP 2.0 и добавили файлы BowncyCastle 1.50, а затем обновили наш старый код до новых используемых интерфейсов. Однако, когда мы попытались провести проверку в нашей реализации, то получили следующую ошибку:
Sign verify error: sign_is_invalid Error building certification path for CN=Ivanov Ivan Ivanovich: ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target

Чтобы решить эту проблему, мы загрузили сертификат пользователя и добавили его в хранилище хранилищ хранилища cacerts по умолчанию, но поскольку сертификат пользователя является производным сертификатом, исключение сообщает нам, что цепочка не может быть завершена, даже если она находится в cacerts:

Issuer: CN="Тестовый УЦ ООО \"КРИПТО-ПРО\" (УЦ 2.0)", O="ООО \"КРИПТО-ПРО\"", C=RU, L=Москва, EMAILADDRESS=info@cryptopro.ru, OID.1.2.643.3.131.1.1=#120C303037373137313037393931, OID.1.2.643.100.1=#120D31303337373030303835343434
Кусок кода, который ведет верификацию:
Collection<X509Certificate> xChain = new ArrayList<X509Certificate>();
CAdESSignature cadesSignature = new CAdESSignature(signature, data, null);
cadesSignature.verify(xChain);

Соответственно вопросы:
1. В чем может быть проблема? Все ли мы делаем правильно при проверке подписи? Ранее мы не работали с JCP 2.0 и DSS, опыт ограничивался JCP 1.0 и локальными криптопро (криптоармом) с использованием корневых сертификатов УЦ.
2. Есть ли образцы примеров для верификации подписи для описанной выше конфигурации? Возможно у DSS сервера существует соответствующая API?
Offline Александр Лавник  
#2 Оставлено : 9 января 2018 г. 14:12:10(UTC)
Александр Лавник

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

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

Сказал «Спасибо»: 7 раз
Поблагодарили: 116 раз в 111 постах
Добрый день.

1) Укажите точную версию КриптоПро JCP 2.0 в формате 2.0.ABCDE.

2) Для выяснения причины появления ошибки соберите лог с уровнем ALL согласно статье в базе знаний.
Техническую поддержку оказываем тут
Наша база знаний
Offline Gennady  
#3 Оставлено : 10 января 2018 г. 14:12:57(UTC)
Gennady

Статус: Участник

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

Доброго дня.
Версия библиотеки 2.0.39442

лог
Caused by: Error building certification path for CN=Ivanov Ivan Ivanovich: ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target; error codes: [33] 'PKIX failure: invalid parameters of certificate',
at ru.CryptoPro.AdES.certificate.CertificateChainBuilderImpl.build(Unknown Source)
at ru.CryptoPro.AdES.certificate.CertificateChainBuilderImpl.build(Unknown Source)
at ru.CryptoPro.AdES.external.signature.AdESSigner.build(Unknown Source)

Offline Александр Лавник  
#4 Оставлено : 10 января 2018 г. 14:26:27(UTC)
Александр Лавник

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

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

Сказал «Спасибо»: 7 раз
Поблагодарили: 116 раз в 111 постах
Автор: Gennady Перейти к цитате
Доброго дня.
Версия библиотеки 2.0.39442

лог
Caused by: Error building certification path for CN=Ivanov Ivan Ivanovich: ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target; error codes: [33] 'PKIX failure: invalid parameters of certificate',
at ru.CryptoPro.AdES.certificate.CertificateChainBuilderImpl.build(Unknown Source)
at ru.CryptoPro.AdES.certificate.CertificateChainBuilderImpl.build(Unknown Source)
at ru.CryptoPro.AdES.external.signature.AdESSigner.build(Unknown Source)



Это не весь лог, а только исключение.

Приложите весь собранный лог в соответствии с рекомендациями из предыдущего сообщения.
Техническую поддержку оказываем тут
Наша база знаний
Offline Gennady  
#5 Оставлено : 11 января 2018 г. 9:06:20(UTC)
Gennady

Статус: Участник

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

Для журналирования мы используем slf4j. Полный журнал, кроме приведенной выдержки, содержит только сообщения об успешной загрузке JCP и замене алгоритма BouncyCastle GOST, что вполне ожидаемо. Ну, и интерфейсы, реализующие проверку (CAdESSignerBESImpl.verify / CAdESSignerPKCS7Impl.verify)

Цитата:

DEBUG 11.01.2018 10:13:23,228 http-nio-8080-exec-2 (our.company.module.crypt.JCPCryptService.checkType():386) [] - Method checkType started. Signature.length = 2557
янв 11, 2018 10:13:24 AM ru.CryptoPro.CAdES.tools.CAdESUtility initJCPAlgorithms
INFO: Replacement of the BouncyCastle GOST algorithms.
янв 11, 2018 10:13:27 AM ru.CryptoPro.JCP.tools.Starter check
INFO: Loading JCP 2.0 39442
янв 11, 2018 10:13:27 AM ru.CryptoPro.JCP.tools.Starter check
INFO: JCP loaded.
ERROR 11.01.2018 10:13:28,324 http-nio-8080-exec-2 (our.company.module.crypt.JCPCryptService.verifyAndGetSignInfo():96) [] - sign_is_invalid
Error building certification path for CN=Ivanov Ivan Ivanovich: ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target; error codes: [33] 'PKIX failure: invalid parameters of certificate',
at ru.CryptoPro.CAdES.CAdESSignerPKCS7Impl.verify(Unknown Source)
at ru.CryptoPro.CAdES.CAdESSignerBESImpl.verify(Unknown Source)
at ru.CryptoPro.CAdES.cl_0.verify(Unknown Source)
at ru.CryptoPro.CAdES.cl_0.verify(Unknown Source)
at ru.CryptoPro.CAdES.cl_0.verify(Unknown Source)
at our.company.module.crypt.CadesServiceImpl.verifyAndGetSignInfo(CadesServiceImpl.java:92)
... 66 more
Caused by: Error building certification path for CN=Ivanov Ivan Ivanovich: ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target; error codes: [33] 'PKIX failure: invalid parameters of certificate',
at ru.CryptoPro.AdES.certificate.CertificateChainBuilderImpl.build(Unknown Source)
at ru.CryptoPro.AdES.certificate.CertificateChainBuilderImpl.build(Unknown Source)
at ru.CryptoPro.AdES.external.signature.AdESSigner.build(Unknown Source)
... 117 more


Настройки журналирования jre мы поправили в соответствии с рекомендациями, и переконфигурировали log4j. т.к. конфигурация приложения перекрывает конфигурацию jre. Level FINE соответствует TRACE в log4j, мы установили в TRACE (соответствует FINER). Конфиг такой:
Цитата:

<appender name="CONSOLE_LOG" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%-5p %d{dd.MM.yyyy HH:mm:ss,SSS} %t (%-c.%M():%L) [%x] - %m%n"/>
</layout>
</appender>

<appender name="CONSOLE_LOG" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%-5p %d{dd.MM.yyyy HH:mm:ss,SSS} %t (%-c.%M():%L) [%x] - %m%n"/>
</layout>
</appender>

<logger name="ru.CryptoPro">
<level value="trace"/>
</logger>

<root>
<priority value="error"/>
<appender-ref ref="CONSOLE_LOG"/>
</root>


К сути ошибки в первом сообщении мало что можно добавить: сертификат, добавленный в jre cacerts, тот, что мы получили от тестового УЦ, имеет ссылку на сертификат, которого у нас нет. Java проверить цепочку не может. Тот сертификат, который должен быть в цепочке - мы найти на сайте не можем. Другие сертификаты на сайте криптопро есть, но того, который необходим - нет. Мы очень хотим понять:
1. Где можно получить сертификат для завершения цепочки? Будет ли достаточно его импортирования в cacerts для успешной проверки?
2. Правильный ли это путь вообще? Поскольку мы подписываем через SOAP, кажется логичным предположить, что и для проверки подписи должен существовать SOAP сервис. Есть ли такой? Если есть - подскажите где его можно найти, в документации найти указаний на него не можем, но поиск в базе знаний и по форуму дает основания предположить, что он может существовать. Где-то.
3. Существует ли референсная реализация JCP 2.0? Мы видели старые примеры для 1.0, глядя на которые и делали свою реализацию когда-то, но изменения в интерфейсах не позволяют опираться на прошлый опыт. Javadoc в JCP 2.0 не включает примеров по проверке отсоединенной подписи.
Offline Евгений Афанасьев  
#6 Оставлено : 11 января 2018 г. 13:13:30(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 12 раз
Поблагодарили: 299 раз в 296 постах
Автор: Gennady Перейти к цитате

сертификат, добавленный в jre cacerts, тот, что мы получили от тестового УЦ, имеет ссылку на сертификат, которого у нас нет

Это сертификат - промежуточный, если у него есть ссылка? В cacerts нужно добавлять только корневые, а клиентский и промежуточные передавать при формировании/проверке подписи (в случае проверки сертификаты могут быть и внутри подписи).
1. Приложите сертификат, в котором ссылка на искомый сертификат.
2. Примеры для 1.0 в большинстве работают и для 2.0 (отличие может быть в алгоритмах - ранее был удален ГОСТ 94, добавлен ГОСТ 2012).

Отредактировано пользователем 11 января 2018 г. 21:18:47(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Gennady  
#7 Оставлено : 11 января 2018 г. 15:35:12(UTC)
Gennady

Статус: Участник

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

Сертификат, с которым экспериментируем:
certificate_11498.cer (2kb) загружен 5 раз(а).
Offline Евгений Афанасьев  
#8 Оставлено : 12 января 2018 г. 10:35:51(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 12 раз
Поблагодарили: 299 раз в 296 постах
Цепочка состоит только из него и корневого "Тестовый УЦ ООО "КРИПТО-ПРО" (УЦ 2.0)". По идее, достаточно добавить корневой в cacerts. Проверю построение цепочки.
Техническую поддержку оказываем тут
Наша база знаний
Offline Gennady  
#9 Оставлено : 12 января 2018 г. 12:49:14(UTC)
Gennady

Статус: Участник

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

На самом деле проблема может быть и в том, что мы не смогли добраться до корневого сертификата УЦ. Потому как не совсем прозрачно откуда именно его взять.
На https://dss.cryptopro.ru нет явного указания на корневой сертификат
А по ссылке на тестовые УЦ часть ссылок с https://www.cryptopro.ru/solutions/test-ca не открывается вообще, открывающиеся мы вроде перепробовали все, но перебирать их - метод не лучший...
Offline Евгений Афанасьев  
#10 Оставлено : 12 января 2018 г. 13:49:00(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 12 раз
Поблагодарили: 299 раз в 296 постах
Ссылка на корневой внутри сертификата: http://testca2.cryptopro...99a6cf6b0cb1b4843f3f.crt
Цепочка построилась и проверилась (по идее, должна и в CAdES/XAdES).
Техническую поддержку оказываем тут
Наша база знаний
Offline Александр Лавник  
#11 Оставлено : 12 января 2018 г. 14:37:15(UTC)
Александр Лавник

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

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

Сказал «Спасибо»: 7 раз
Поблагодарили: 116 раз в 111 постах
Автор: Gennady Перейти к цитате
2. Правильный ли это путь вообще? Поскольку мы подписываем через SOAP, кажется логичным предположить, что и для проверки подписи должен существовать SOAP сервис. Есть ли такой? Если есть - подскажите где его можно найти, в документации найти указаний на него не можем, но поиск в базе знаний и по форуму дает основания предположить, что он может существовать. Где-то.



Добрый день.

Для проверки подписи совместно с КриптоПро DSS может использоваться КриптоПро SVS, с которым можно работать через SOAP.

Отредактировано пользователем 15 января 2018 г. 8:57:12(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Gennady  
#12 Оставлено : 15 января 2018 г. 8:20:50(UTC)
Gennady

Статус: Участник

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

Спасибо. Проблема решена.Помогло добавление сертификата
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.