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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline vasyurko  
#1 Оставлено : 26 августа 2011 г. 20:03:31(UTC)
vasyurko

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

Группы: Участники
Зарегистрирован: 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; надо что-то другое прописать?
Помогите пожалуйста!
Offline Kirill Sobolev  
#2 Оставлено : 29 августа 2011 г. 15:07:54(UTC)
Кирилл Соболев

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

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
А возможно дело в кривом заголовке для дельфи - http://www.cryptopro.ru/...ro/forum/view.asp?q=2487 .
Техническую поддержку оказываем тут
Наша база знаний
Offline vasyurko  
#3 Оставлено : 29 августа 2011 г. 16:24:01(UTC)
vasyurko

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

Группы: Участники
Зарегистрирован: 26.08.2011(UTC)
Сообщений: 3
Откуда: Маськва

Я использую юнит JwaWinCrypt.pas т.к. не раз видел сообщения в разных форумах, что wincrypt2.pas с ошибками.
Кроме того моя программа работает без ошибок, как при подписывании, так и при снятии подписи. В результате получается исходный файл байт в байт. Т.е. проблема в том, что подпись добавляется в каком-то формате, который не понимает КриптоАРМ.
Offline Роман кислухин  
#4 Оставлено : 29 августа 2011 г. 17:50:37(UTC)
Роман кислухин

Статус: Активный участник

Группы: Участники
Зарегистрирован: 29.03.2011(UTC)
Сообщений: 170
Мужчина
Откуда: Москва

Сказал «Спасибо»: 8 раз
Поблагодарили: 3 раз в 3 постах
Тоже было бы интересно понять, в чем причина.
У нас то же самое. Причем снятие подписи при помощи API работает как для подписанных КриптоАрм-ом файлов, так и для наших. Но вот снятие подписи самим КриптоАрм-ом - не работает.
Возможно дело в расширенных параметрах подписи, которые туда записывает КриптоАрм. Возможно, формат не такой.
Offline Kirill Sobolev  
#5 Оставлено : 30 августа 2011 г. 15:38:55(UTC)
Кирилл Соболев

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

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Цитата:
Т.е. проблема в том, что подпись добавляется в каком-то формате, который не понимает КриптоАРМ.

А csptest ее проверяет?
Техническую поддержку оказываем тут
Наша база знаний
Offline vasyurko  
#6 Оставлено : 31 августа 2011 г. 15:34:08(UTC)
vasyurko

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

Группы: Участники
Зарегистрирован: 26.08.2011(UTC)
Сообщений: 3
Откуда: Маськва

Kirill Sobolev написал:
Цитата:
Т.е. проблема в том, что подпись добавляется в каком-то формате, который не понимает КриптоАРМ.

А csptest ее проверяет?

Да, csptest ее успешно проверяет и снимает. Получается исходный файл. Крипто АРМ при этом выдает ошибку.
Исходный файл, который я подписываю имеет размер 470 байт.
При подписывании этого файла разными способами получаются файлы разных размеров:
Файл с подписью полученный при помощи csptest без включения сертификата имеет размер 1358 байт.
Файл с подписью полученный при помощи csptest с добавлением сертификата имеет размер 2474 байт.
Файл полученный с помощью моей программы - 2490 байт.

Кстати, спасибо за идею использования csptest. В принципе меня устроит использование этой утилиты (для моей задачи этого достаточно).
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.