Статус: Новичок
Группы: Участники
Зарегистрирован: 26.08.2011(UTC) Сообщений: 3 Откуда: Маськва
|
Руководство поставило задачу - автоматизировать процесс подписания и отправки файлов. Сейчас приходится выгружать файлы из почтовой программы, далее подписывать их с помощью приложения КриптоАРМ (криптопро 3.6), а затем загружать файлы обратно в почтовую программу. Надо сделать так, чтобы данный процесс происходил по нажатию одной кнопки, без лишних телодвижений. Изучив всю документацию, перепробовав несколько способов, я научился подписывать/снимать подпись. Для этого я использую Delphi и библиотеки CryptoAPI, а общих чертах алгоритм следующий: 1. Октрываю хранилище сертификатов MY (CertOpenSystemStore) 2. Нахожу нужный мне сертификат (CertEnumCertificatesInStore) 3. Подписываю сообщение (CryptSignMessage) Фрагмент кода: Код:/**********************************************************/
pStreamIn := TMemoryStream.Create;
pStreamIn.LoadFromFile( 'c:\temp\test.txt' );
pStreamOut := TMemoryStream.Create;
FillChar(SigParams, SizeOf( CRYPT_SIGN_MESSAGE_PARA ), #0);
MessageArray[1] := pStreamIn.Memory;
MessageSize[1] := pStreamIn.Size;
MessageCert[1] := aCert;
SigParams.cbSize := SizeOF( CRYPT_SIGN_MESSAGE_PARA );
SigParams.dwMsgEncodingType := X509_ASN_ENCODING or PKCS_7_ASN_ENCODING;
SigParams.pSigningCert := aCert;
SigParams.HashAlgorithm.pszObjId := szOID_CP_GOST_R3411;
SigParams.cMsgCert := 1;
SigParams.rgpMsgCert := @MessageCert;
aSize := 0;
if not (CryptSignMessage(@SigParams, false, 1, @MessageArray, @MessageSize, nil, aSize)) then
mText.Lines.Add('CryptSignMessage OK. Размер буфера: ' + IntToStr(GetLastError) )
else
mText.Lines.Add(Err('Ошибка CryptSignMessage. Size: ' + IntToStr(aSize)));
pStreamOut.Size := aSize;
if not (CryptSignMessage( @SigParams, false, 1, @MessageArray, @MessageSize, pStreamOut.Memory, aSize )) then
mText.Lines.Add(Err('Файл не подписан'));
pStreamOut.SaveToFile('c:\temp\test.txt.sig');
mText.Lines.Add('Файл успешно подписан');
/**********************************************************/
Для проверки и снятия подписи использую CryptVerifyMessageSignature. Этот способ работает. Проблема в том, что когда я пытаюсь снять подпись наложенную моей программой с помощью приложения КриптоАРМ возникает ошибка: Ошибка сохранения сообщения (0x80004005) Произошла ошибка при загрузке сообщения. Вероятно, сообщение имеет некорректный формат. (0x80004005) Т.е. клиент который получит мой файл и пользуется КриптоАРМ не сможет снять подпись. М.б. я неправильно заполняю структуру SigParams? Возможно, SigParams.dwMsgEncodingType := X509_ASN_ENCODING or PKCS_7_ASN_ENCODING; надо что-то другое прописать? Помогите пожалуйста!
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
|
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 26.08.2011(UTC) Сообщений: 3 Откуда: Маськва
|
Я использую юнит JwaWinCrypt.pas т.к. не раз видел сообщения в разных форумах, что wincrypt2.pas с ошибками. Кроме того моя программа работает без ошибок, как при подписывании, так и при снятии подписи. В результате получается исходный файл байт в байт. Т.е. проблема в том, что подпись добавляется в каком-то формате, который не понимает КриптоАРМ.
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 29.03.2011(UTC) Сообщений: 170  Откуда: Москва Сказал «Спасибо»: 8 раз Поблагодарили: 3 раз в 3 постах
|
Тоже было бы интересно понять, в чем причина. У нас то же самое. Причем снятие подписи при помощи API работает как для подписанных КриптоАрм-ом файлов, так и для наших. Но вот снятие подписи самим КриптоАрм-ом - не работает. Возможно дело в расширенных параметрах подписи, которые туда записывает КриптоАрм. Возможно, формат не такой.
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:Т.е. проблема в том, что подпись добавляется в каком-то формате, который не понимает КриптоАРМ. А csptest ее проверяет? |
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 26.08.2011(UTC) Сообщений: 3 Откуда: Маськва
|
Kirill Sobolev написал:Цитата:Т.е. проблема в том, что подпись добавляется в каком-то формате, который не понимает КриптоАРМ. А csptest ее проверяет? Да, csptest ее успешно проверяет и снимает. Получается исходный файл. Крипто АРМ при этом выдает ошибку. Исходный файл, который я подписываю имеет размер 470 байт. При подписывании этого файла разными способами получаются файлы разных размеров: Файл с подписью полученный при помощи csptest без включения сертификата имеет размер 1358 байт. Файл с подписью полученный при помощи csptest с добавлением сертификата имеет размер 2474 байт. Файл полученный с помощью моей программы - 2490 байт. Кстати, спасибо за идею использования csptest. В принципе меня устроит использование этой утилиты (для моей задачи этого достаточно).
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close