Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,687   Сказал «Спасибо»: 573 раз Поблагодарили: 2303 раз в 1804 постах
|
Автор: Setix  В общем в теме очень мало знаю постараюсь описать ситуацию. С 1 января 2020 вводится маркировка лекарственных препаратов. Перед отправкой файлов необходимо их подписывать. В инструкции дан пример подписи через КриптоПро через командную строку: csptest -sfsign -sign -in <УКАЗАТЬ ПОЛНЫЙ ПУТЬ К ФАЙЛУ>test.txt –out <УКАЗАТЬ ПОЛНЫЙ ПУТЬ К ФАЙЛУ>out.txt -my "АО Фурацилин" -detached -base64 –add Теперь собственно вопрос: как можно создать подпись с помощью СOM интерфейса. Метод ICPSignedData2::SignCades Цитата: HRESULT SignCades ( VARIANT Signer, CADESCOM_CADES_TYPE CadesType, VARIANT_BOOL bDetached, CAPICOM_ENCODING_TYPE EncodingType, BSTR *pVal );
Должно быть: Цитата: oSignedData.SignCades(oSigner,{CADES_BES}1,TRUE,{CAPICOM_ENCODE_BASE64}0);
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 19.09.2019(UTC) Сообщений: 28  Откуда: МСК
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 19.09.2019(UTC) Сообщений: 28  Откуда: МСК
|
Андрей, можно ли привести пример использования COM объекта который будет работать аналогично командной строке: csptest -sfsign -sign -in <УКАЗАТЬ ПОЛНЫЙ ПУТЬ К ФАЙЛУ>test.txt –out <УКАЗАТЬ ПОЛНЫЙ ПУТЬ К ФАЙЛУ>out.txt -my "АО Фурацилин" -detached -base64 –add Пробовал выше написанный код для создания подписи, он отклоняется службой маркировки, при том файл созданный командной строкой принимает нормально. Видимо какой то из параметров либо не указываю, либо использую что то не то. Отредактировано пользователем 23 сентября 2019 г. 16:00:48(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,687   Сказал «Спасибо»: 573 раз Поблагодарили: 2303 раз в 1804 постах
|
В коде какая подпись генерируется, исправлено на отсоединенную?
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 19.09.2019(UTC) Сообщений: 28  Откуда: МСК
|
В коде какая подпись генерируется, исправлено на отсоединенную? да в качестве параметра подаю True.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,687   Сказал «Спасибо»: 573 раз Поблагодарили: 2303 раз в 1804 постах
|
Автор: Setix  В коде какая подпись генерируется, исправлено на отсоединенную? да в качестве параметра подаю True. В ЛС пришлите файл, который подписывали и файл подписи или сами проверьте утилитой то, что отправляете сервису. |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,687   Сказал «Спасибо»: 573 раз Поблагодарили: 2303 раз в 1804 постах
|
Пример, без кодирования в base64:
Код:var
sSerialNumber: AnsiString;
oSigner: Olevariant;
outCTR: Olevariant;
oSignedData: OleVariant;
sSignedData: OleVariant;
Buffer: WideString;
FileStm: TFileStream;
begin
FileStm := TFileStream.Create(SourceFile.Text, fmOpenRead or fmShareDenyWrite);
try
Pointer(Buffer) := ActiveX.SysAllocStringByteLen(nil, FileStm.Size);
FileStm.ReadBuffer(Pointer(Buffer)^, FileStm.Size);
finally
FreeAndNil(FileStm);
end;
sSerialNumber := '01F349E07AC40CD480E8119BF4C5BB9FE2'; {номер сертификата}
oSigner := COMOBJ.CreateOleObject('CAdESCOM.CPSigner'); {}
if GetSignerCertificate(sSerialNumber, outCTR) then {если нашли указанный сертификат}
begin
oSigner.Certificate := outCTR; {}
oSignedData := COMOBJ.CreateOleObject('CAdESCOM.CadesSignedData'); {}
oSignedData.ContentEncoding := 0; // или 1; {}
oSignedData.Content := Buffer; // или при ContentEncoding кодировать => 'U29tZSBEYXRhLg=='; {}
sSignedData := oSignedData.SignCades(oSigner, {CADES_BES}1, True, {CAPICOM_ENCODE_BASE64}0); {получаем подписанные данные}
Logs.Text := sSignedData;
try
oSignedData.VerifyCades(sSignedData, {CADES_BES}1, True); {проверяем подписанные данные}
ShowMessage('Подпись верна')
except
on E: Exception do
ShowMessage('Подпись не верна: ' + E.Message)
end;
end;
end;
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,687   Сказал «Спасибо»: 573 раз Поблагодарили: 2303 раз в 1804 постах
|
Идея понятна, при работе через COM? Код:
Buffer: WideString;
...
FileStm.ReadBuffer(Buffer[1], FileStm.Size);
...
oSignedData.ContentEncoding := 0;
oSignedData.Content := Buffer;
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 19.09.2019(UTC) Сообщений: 28  Откуда: МСК
|
Автор: Андрей Писарев  Идея понятна, при работе через COM? Код:
Buffer: WideString;
...
FileStm.ReadBuffer(Buffer[1], FileStm.Size);
...
oSignedData.ContentEncoding := 0;
oSignedData.Content := Buffer;
Идея понятна, только не понятно почему результат с ошибкой. Видимо в контент не те данные подаю, буду разбираться.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,687   Сказал «Спасибо»: 573 раз Поблагодарили: 2303 раз в 1804 постах
|
Автор: Setix  Автор: Андрей Писарев  Идея понятна, при работе через COM? Код:
Buffer: WideString;
...
FileStm.ReadBuffer(Buffer[1], FileStm.Size);
...
oSignedData.ContentEncoding := 0;
oSignedData.Content := Buffer;
Идея понятна, только не понятно почему результат с ошибкой. Видимо в контент не те данные подаю, буду разбираться. Мой код не работает? |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close