Стоит задача - подружить Diadoc с произвольной конфигурацией на платформе 8.3 с помощью http api. Проблема возникла при попытке подписи входящего неформализованного документа.
Изучив мануал понимаю, что для подписи нужно отправить патч сообщения, в котором будет содержаться ЭП со ссылкой на мою сущность (документ). Вот такой запрос у меня получился:
//СертификатКриптографии - сертификат, под которым я авторизован в Диадок. Тип:СертификатКриптографии
//ИдентификаторСообщения - MessageId сообщения, в котором содержится подписываемый документ
//ИдентификаторСущности - EntityId сущности подписываемого документа в сообщении
ДвоичноеСодержимоеСертификата = СертификатКриптографии.Выгрузить();
ПатчСообщения = Новый Структура;
ПатчСообщения.Вставить("BoxId", ЯщикОрганизации);
ПатчСообщения.Вставить("MessageId", ИдентификаторСообщения);
ПатчСообщения.Вставить("Signatures", Новый Массив);
DocumentSignature = Новый Структура;
DocumentSignature.Вставить("ParentEntityId", ИдентификаторСущности);
DocumentSignature.Вставить("SignWithTestSignature", Ложь);
DocumentSignature.Вставить("IsApprovementSignature", Ложь);
DocumentSignature.Вставить("Signature", Base64Строка(ДвоичноеСодержимоеСертификата));
ПатчСообщения.Signatures.Добавить(DocumentSignature);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(, Символы.Таб));
ЗаписатьJSON(ЗаписьJSON, ПатчСообщения);
ПатчСообщенияJSON = ЗаписьJSON.Закрыть();
Показать
Содержимое тела ответа: MessagePatchToPost.Signatures[0]: Invalid signature
1. Исходя из содержания ошибки, вопрос - правильно ли я передаю подпись?
2. Правильный ли я выбрал метод для подписания документа?
3. Правильно ли я составил тело запроса для моей задачи?
По описанию не пойму: в поле Signature разве данные самой подписи должны быть, а не уже подписанное сообщение? Причем я смотрю они еще пишут, что нужно передавать в DER кодировке, а не в BASE64.
Signature - ЭП (в некоторых случаях может отсутствовать). Если ЭП присутствует, то она должна быть представлена в формате CMS SignedData в DER-кодировке.
Я думаю, Вы правы. Проблема в кодировке. Правда, у меня ни одной идеи, как получить ЭП CMS SignedData в DER-кодировке.
*К слову, я уже передавал сертификат в теле запроса ранее, при выполнении метода AuthenticateConfirm. Но согласно мануалу требовался сертификат X.509
... тело запроса должно содержать X.509 сертификат пользователя, сериализованный в DER
У вас есть информация о том, как получить ЭП CMS SignedData в DER-кодировке?
вон же выше по ссылке какой-то пример есть.
В процедуре SignCades поэксперементировать с последним параметром CAPICOM_ENCODE_BASE64 / CAPICOM_ENCODE_BINARY
(9) Спасибо, есть прогресс.
Сервер вернул код 200, свойство Signature я передал следующим образом:
Получаем значение для свойства Signature
СертификатКриптографии = Новый СертификатКриптографии(Base64Значение(СертификатBase64));
Отпечаток = СертификатКриптографии.Отпечаток;
ОтпечатокСтрока = СтрЗаменить(Строка(Отпечаток), " ", ""); //временный костыль
Store = Новый COMОбъект("CAdESCOM.Store");
Store.Open(2);
Certificates = Store.Certificates;
Certificate = Неопределено;
Если Certificates.Count<>0 Тогда
Для Каждого CurrentCertificate Из Store.Certificates Цикл
Если CurrentCertificate.Thumbprint=ОтпечатокСтрока Тогда
Certificate = CurrentCertificate;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Store.Close();
Если Certificate<>Неопределено Тогда
Signer = Новый COMОбъект("CAdESCOM.CPSigner");
Signer.Certificate = Certificate;
Signer.Options = 2;
CadesSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData");
Signature = CadesSignedData.SignCades(Signer, 1, Истина);
КонецЕсли;
Показать
Вот только на форме документа в Диадок пишет Ошибка при подписании документа.
(10) Нет.
Более подробное описание ошибки бы получить.
Ну тут понятное дело - либо что-то с подписью не то, либо каких-то параметров не хватает ему в протобуфере MessagePatchToPost.
Помимо подписанных данных, может неподписанное содержимое надо передавать. Или может сделать прикрепленную подпись попробовать.
Я не знаю.