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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Marat1988  
#1 Оставлено : 2 апреля 2023 г. 3:43:18(UTC)
Marat1988

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

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

Сказал «Спасибо»: 2 раз
Добрый день. Сейчас разрабатываю глубокую интеграцию свой учетной системы с оператором ЭДО. Там идут обычные POST-запросы. Собственно уже все сделал. Даже УПД (с функцией СЧФДОП https://www.diadoc.ru/do...clid=lfyo12xrk3256168295 или https://www.diadoc.ru/docs/forms/upd/structure/8) отправляется в личный Web-кабинет оператора ЭДО. Вопрос у меня вот в чем. Как можно подписывать документы (в моем случае это только УПД) непосредственно из моей учетной системы?
В документации по API оператора ЭДО сказано, что при POST-запросе (при отправке УПД) нужно использовать два параметра:
1) Это source_doc_content - xml документа, закодированной в base64. Собственно я и получаю данные непосредственно в своей учетной системе (в моем случае это хранимая процедура на MS SQL Server). Потом кодирую эти данные в BASE64. И отправляю. Но отправляется УПД не подписанная.
2) sign_content подпись документа, закодированной в base64. Вот здесь и есть моя основная проблема. Так как я здесь даже малейшего представления не имею. Я не разбираюсь криптографии вообще.

Долго гуглил (https://cpdn.cryptopro.ru/content/cades/plugin-samples-hashed-data-bin.html). И как я понял, что я должен получить некое хеш-значение из моих данные (которые я получил в пункте 1 в виде BASE64). И только потом это хеш-значение подписать. Потом получившееся значение отправить в качестве sign_content в POST запросе.
Нашел кусок кода (на delphi), как получить хеш значение

procedure TForm1.Button11Click(Sender: TObject);
var HashedData: Olevariant; sHashValue: string;
begin
HashedData:=CreateOleObject('CADESCOM.HashedData');
HashedData.Algorithm:=101;
HashedData.DataEncoding:=1;
HashedData.Hash('U29tZSBEYXRhLg==');
sHashValue:=HashedData.value;
HashedData:=UnAssigned;
end;


Не могли бы Вы подсказать, куда и в какое "направление" мне двигаться, чтобы решить вопрос по подписанию документов из своей учетной системы? Было бы круто, если бы привели образцы кода на Delphi. Спасибо. Заранее прошу прощения за глупые вопросы. Я просто в криптографии полный нольAngel

P.S. Если подписывать из личного кабинета оператора ЭДО, то выглядит это следующий образом. Жмется кнопка подписать. Появляется выбор сертификата. Выбираем сертификат. Подпись появляется на документе. Мне только нужно, чтобы пользователь подписывал также документы из своей учетной системы и не входя в личный кабинет. Предполагаю, что нужно использовать COM-объекты CAdESCOM.HashedData, CADESCOM.CPSigner и прочее.

Offline Андрей *  
#2 Оставлено : 2 апреля 2023 г. 11:18:04(UTC)
Андрей *

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

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

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
Здравствуйте.

Подписание делать так же, получать с сервера xml, кодировать в base64 и подписывать через cadescom, тип отсоединенная подпись. Перед подписанием указать, что xml был закодирован в base64. Забыть про хеши.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Marat1988 оставлено 02.04.2023(UTC)
Offline Андрей *  
#3 Оставлено : 2 апреля 2023 г. 11:20:22(UTC)
Андрей *

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

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

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Marat1988 оставлено 02.04.2023(UTC)
Offline Marat1988  
#4 Оставлено : 2 апреля 2023 г. 23:37:49(UTC)
Marat1988

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

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

Сказал «Спасибо»: 2 раз
Автор: Андрей * Перейти к цитате
https://docs.cryptopro.ru/cades/plugin/plugin-samples/plugin-samples-sign-detached


ОК. Спасибо. Как я понимаю, то я должен уже получившуюся кодированную строку в Base64 (которая у меня уже формируется на сервере), например PD94bWwgIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IndpbmRvd3MtMTI1MSI/PjzU4OnrIMjk1O и дальше много символов (в районе 9000) подписать. Посмотрел код на JavaScript (синхронная версия). Переписал на Delphi. Код пока достаточно "сырой", но тестировать уже можно

procedure TForm1.Button12Click(Sender: TObject);
const CAPICOM_LOCAL_MACHINE_STORE = 1;
CAPICOM_STORE_OPEN_READ_ONLY = 0;
CAPICOM_CERTIFICATE_FIND_SHA1_HASH: byte =0;
CADESCOM_BASE64_TO_BINARY = 1;
CADESCOM_CADES_BES = 1;
var Store, Certs, Cert, Signer, SignedData: Olevariant;
Base64Out: widestring; //Выходные подписанные данные, которые я предполагаю получить.
begin
try
Store:=CreateOleObject('CADESCOM.Store');
Store.Open(CAPICOM_LOCAL_MACHINE_STORE, 'My', CAPICOM_STORE_OPEN_READ_ONLY);

Certs:=Store.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH,'hghghhed2806eb7235a7be9557471d1315eefdgg');// hghghhed2806eb7235a7be9557471d1315eefdgg - это отпечаток сертификата.
Cert:=Certs.Item[1];

Signer:=CreateOleObject('CADESCOM.CPSigner');
Signer.Options:=1;
Signer.Certificate:=Cert;

SignedData:=CreateOleObject('CAdESCOM.CadesSignedData');
SignedData.ContentEncoding:=CADESCOM_BASE64_TO_BINARY;
SignedData.Content:=memo1.Text; //В memo1.text хранятся данные в BASE64 (закодированные от XML), которые получены от сервера

Base64Out:=SignedData.SignCades(Signer, CADESCOM_CADES_BES, true);
memo2.Text:=Base64Out; //Здесь я ожидаю чуда, т.е. подписанные данные в BASE64, которые смогу передать в POST-запросе

SignedData:=UnAssigned;
Signer:=UnAssigned;
Store:=UnAssigned;
except
On E:Exception do
begin
ShowMessage(E.Message);
SignedData:=UnAssigned;
Signer:=UnAssigned;
Store:=UnAssigned;
end;
end

P.S. Протестировать смогу только завтра. Спасибо.

Отредактировано пользователем 2 апреля 2023 г. 23:40:28(UTC)  | Причина: Не указана

Offline Андрей *  
#5 Оставлено : 3 апреля 2023 г. 0:49:02(UTC)
Андрей *

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

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

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
CAPICOM_LOCAL_MACHINE_STORE - намеренно используется?
Обычно сертификат установлен в Личное текущего пользователя, который работает с приложением.
Техническую поддержку оказываем тут
Наша база знаний
Offline Marat1988  
#6 Оставлено : 3 апреля 2023 г. 19:10:18(UTC)
Marat1988

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

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

Сказал «Спасибо»: 2 раз
Автор: Андрей * Перейти к цитате
CAPICOM_LOCAL_MACHINE_STORE - намеренно используется?
Обычно сертификат установлен в Личное текущего пользователя, который работает с приложением.


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

P.S. Сегодня протестировал код на delphi. Получил строку Base64Out. Передал эту строку в POST-запросе. И все ОК. УПД отправилась подписанная (это можно визуально увидеть в личном кабинете оператора ЭДО). В общем, все превосходно Angel
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.