Diadoc HTTP API. Подпись входящих неформализованных документов

1. vsyaschenko 11.11.21 11:16 Сейчас в теме
Доброго времени суток!

Стоит задача - подружить Diadoc с произвольной конфигурацией на платформе 8.3 с помощью http api. Проблема возникла при попытке подписи входящего неформализованного документа.

Изучив мануал понимаю, что для подписи нужно отправить патч сообщения, в котором будет содержаться ЭП со ссылкой на мою сущность (документ). Вот такой запрос у меня получился:

Запрос


Формирование ПатчСообщенияJSON


Содержимое тела ответа: MessagePatchToPost.Signatures[0]: Invalid signature

1. Исходя из содержания ошибки, вопрос - правильно ли я передаю подпись?
2. Правильный ли я выбрал метод для подписания документа?
3. Правильно ли я составил тело запроса для моей задачи?

Если есть примеры кода, буду сильно благодарен.
Найденные решения
12. vsyaschenko 24.11.21 09:22 Сейчас в теме
Решил проблему следующим образом:

1. Установил КриптоПро CSP 5.0.11455 КС1 вместо 4-й версии.
2. Следующим фрагментом кода подписал документ

	

Функция СоздатьЭлектроннуюПодписьCMSвDER(Данные, СертификатКриптографии) Экспорт
	
		МенеджерКриптографии = Новый МенеджерКриптографии("" ,"" , 80);		
		ПодписанныеДанные = МенеджерКриптографии.Подписать(Данные, СертификатКриптографии);
		
		Возврат Base64Строка(ПодписанныеДанные);
	
	КонецФункции ​

Показать


С КриптоПро 4.х.х эта функция возвращала ЭП, которую Диадок считал невалидной.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. starjevschik 11.11.21 11:17 Сейчас в теме
у Диадока хорошая техподдержка. Быстрая и адекватная. Чатик на сайте у них.
3. vsyaschenko 11.11.21 11:24 Сейчас в теме
(2) По API не консультируют бесплатно. В чате оглашают прайс по таким вопросам :)
4. artemsmtp 11.11.21 14:21 Сейчас в теме
А не проще работать с компонентой Diadoc?
https://1c-docs.diadoc.ru/ru/latest/index.html
5. vsyaschenko 11.11.21 16:48 Сейчас в теме
(4) Весь функционал построен на взаимодействии через http api, использовать компоненту для решения одной подзадачи не целесообразно.
6. shurikvz 11.11.21 20:29 Сейчас в теме
По описанию не пойму: в поле Signature разве данные самой подписи должны быть, а не уже подписанное сообщение? Причем я смотрю они еще пишут, что нужно передавать в DER кодировке, а не в BASE64.
8. vsyaschenko 12.11.21 13:17 Сейчас в теме
(6) Согласно мануалу:
Signature - ЭП (в некоторых случаях может отсутствовать). Если ЭП присутствует, то она должна быть представлена в формате CMS SignedData в DER-кодировке.


Я думаю, Вы правы. Проблема в кодировке. Правда, у меня ни одной идеи, как получить ЭП CMS SignedData в DER-кодировке.

*К слову, я уже передавал сертификат в теле запроса ранее, при выполнении метода AuthenticateConfirm. Но согласно мануалу требовался сертификат X.509
... тело запроса должно содержать X.509 сертификат пользователя, сериализованный в DER


В тело я помещал следующее значение, и все ок.
СертификатBase64 = Base64Строка(СертификатКриптографии.Выгрузить());
ЗапросHTTP. УстановитьТелоИзСтроки(СертификатBase64);



У вас есть информация о том, как получить ЭП CMS SignedData в DER-кодировке?
9. shurikvz 12.11.21 18:45 Сейчас в теме
(8)
У вас есть информация о том, как получить ЭП CMS SignedData в DER-кодировке?

вон же выше по ссылке какой-то пример есть.
В процедуре SignCades поэксперементировать с последним параметром CAPICOM_ENCODE_BASE64 / CAPICOM_ENCODE_BINARY
vsyaschenko; +1 Ответить
10. vsyaschenko 15.11.21 17:36 Сейчас в теме
(9) Спасибо, есть прогресс.
Сервер вернул код 200, свойство Signature я передал следующим образом:

Получаем значение для свойства Signature


Вот только на форме документа в Диадок пишет Ошибка при подписании документа.

С таким не сталкивались?
11. shurikvz 15.11.21 21:22 Сейчас в теме
(10) Нет.
Более подробное описание ошибки бы получить.

Ну тут понятное дело - либо что-то с подписью не то, либо каких-то параметров не хватает ему в протобуфере MessagePatchToPost.
Помимо подписанных данных, может неподписанное содержимое надо передавать. Или может сделать прикрепленную подпись попробовать.
Я не знаю.
vsyaschenko; +1 Ответить
7. shurikvz 11.11.21 21:17 Сейчас в теме
12. vsyaschenko 24.11.21 09:22 Сейчас в теме
Решил проблему следующим образом:

1. Установил КриптоПро CSP 5.0.11455 КС1 вместо 4-й версии.
2. Следующим фрагментом кода подписал документ

	

Функция СоздатьЭлектроннуюПодписьCMSвDER(Данные, СертификатКриптографии) Экспорт
	
		МенеджерКриптографии = Новый МенеджерКриптографии("" ,"" , 80);		
		ПодписанныеДанные = МенеджерКриптографии.Подписать(Данные, СертификатКриптографии);
		
		Возврат Base64Строка(ПодписанныеДанные);
	
	КонецФункции ​

Показать


С КриптоПро 4.х.х эта функция возвращала ЭП, которую Диадок считал невалидной.
13. Rollam 23.12.21 14:46 Сейчас в теме
(12)
А если нужно получить сертификат в DER кодировке вне подписания документа?
14. vsyaschenko 10.01.22 14:12 Сейчас в теме
(13) Здесь увы не подскажу. Возможно Вам поможет COM интерфейс КриптоПро https://docs.cryptopro.ru/cades/reference/cadescom
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот