powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сделать цифровую подпись на основе сертификата
25 сообщений из 128, страница 4 из 6
Как сделать цифровую подпись на основе сертификата
    #35305487
Фотография Miktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык я вроде сразу предлагал :) (найду где продаются ВебМани обязательно отблагодарю)
С датами все получилось. Спасибо. Последние 2 маленьких вопроса: Как получить имя серт. центра и владельца сертификата?
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35305588
renaton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MiktorДык я вроде сразу предлагал :) (найду где продаются ВебМани обязательно отблагодарю)
С датами все получилось. Спасибо. Последние 2 маленьких вопроса: Как получить имя серт. центра и владельца сертификата?

не сможешь поделицца исходниками?
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35306332
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miktor, упрощенно вот так...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
 procedure  BinToHexInverted( Buffer, Text: PChar; BufSize: Integer);
 const 
  Convert :  Array  [  0 .. 15  ]  of  Char = '0123456789abcdef';
 var 
  ii : Integer;
 begin 
   for  ii := BufSize -  1   downto   0   do 
   begin 
    Text[  0  ] := Convert[ Byte( Buffer[ ii ])  shr   4  ];
    Text[  1  ] := Convert[ Byte( Buffer[ ii ])  and  $F ];
    Inc( Text,  2  );
   end ;
 end ;

 function  DecodeSerialNumber( Source : PCRYPT_INTEGER_BLOB ) :  String ;
 begin 
  SetLength( Result, Source.cbData *  2  );
  BinToHexInverted( PChar( Source.pbData ), Pointer( Result ), Source.cbData );
 end ;

 function  DecodeName( Source : PCRYPTOAPI_BLOB ) :  String ;
 var  iLength : DWORD;
 begin 
  iLength := CertNameToStr( MY_ENCODING_TYPE,
                            PCERT_NAME_BLOB( Source ),
                            CERT_OID_NAME_STR,
                             nil ,  0  );
  SetLength( Result, iLength );
  iLength := CertNameToStr( MY_ENCODING_TYPE,
                            PCERT_NAME_BLOB( Source ),
                            CERT_OID_NAME_STR,
                            Pointer( Result ), iLength );
  SetLength( Result, iLength );
 end ;

ну и примеры вызовов...
Код: plaintext
1.
2.
3.
4.
5.
  ...
  DecodeName( @Certificate.pCertInfo.Subject )
  DecodeName( @Certificate.pCertInfo.Issuer )
  DecodeSerialNumber( @Certificate.pCertInfo.SerialNumber )
  ...

Поиграйтесь с dwStrType у CertNameToStr и определитесь, что именно вам необходимо из данных, возможно хватит и флага CERT_SIMPLE_NAME_STR
Если капать дальше, то OIDs описаны в разделе Name Properties в Platform SDK, до кучи типы X500 частично описаны таблицей в описании функции CertStrToName
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35306339
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
renatonне сможешь поделицца исходниками?
любой каприз за ваши деньги... все равно я напишу быстрее, чем вы сумеете понять суть )
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35306644
renaton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где достать правильный файл CryptoAPI.pas ???
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35307631
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
renatonА где достать правильный файл CryptoAPI.pas ???
Уже обсуждалось начиная от.
Для полноценной работы так же необходимы оригинальный WinCrypt.h (7z) ( zip ) и MS Platform SDK... чем выше версии, тем лучше
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35310522
renaton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как сделать так чтобы в свойствах подписаннго файла появилась вкладка подписи и там уже показывались подписанные сертификаты????
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35310645
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
renatonКак сделать так чтобы в свойствах подписаннго файла появилась вкладка подписи и там уже показывались подписанные сертификаты????
Добрый день. Я не понял вопроса. Почти все обсуждение мы говорим об "присоединенной" подписи. Я уже озвучивал, что она по своей сути является хранилищем сертификатов. "показывались подписанные сертификаты" наверное имелось ввиду сертификаты подписавших... в примерах формировали подпись в файле test.sig, чтобы винда корректно открывала подпись в снапине... ".sig" можно заменить на одно из зарегистрированных расширений, к примеру так test.p7s.
Или мы про программную реализацию... тогда вот так (я немного поменял обвязку кода, который уже приводил ранее в калбек функции GetSignerCertificate):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
 var 
  Store : HCERTSTORE;
  Blob : CRYPTOAPI_BLOB;
  pStream : TMemoryStream;
  Certificate : PCCERT_CONTEXT;
 begin 
  pStream := TMemoryStream.Create;
   try 
    Stream.LoadFromFile( 'c:\test.sig' );
    Blob.cbData := pStream.Size;
    Blob.pbData := pStream.Memory;
    Store := CertOpenStore( CERT_STORE_PROV_PKCS7, MY_ENCODING_TYPE,  0 ,  0 , @Blob );
     if   not  Assigned( Store )  then 
      Err( 'Не удалось открыть хранилище' );
    Certificate :=  nil ;
     repeat 
      Certificate := CertEnumCertificatesInStore( Store, Certificate );
       if  Assigned( Certificate )  then 
       begin 
         { тут можно делать с контекстом серитфиката все, что вашей душе угодно } 
       end ;
     until   not  assigned( Certificate );
     if  (  not  CertCloseStore( Store, CERT_CLOSE_STORE_CHECK_FLAG ))  then 
      Err( 'Ошибка закрытия хранилища' );
   finally 
    FreeAndNil( pStream );
   end ;

тут уже нет никакой валидации подписи и она просто рассматривается как хранилище
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35310661
renaton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так может вот этот скриншот пояснит мой вопрос, это свойтсва инсталлятора АдобеРидер 8
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35310810
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
renatonТак может вот этот скриншот пояснит мой вопрос, это свойтсва инсталлятора АдобеРидер 8

Зачем вы оверкворите.. неудобно же читать. То, что вы хотите... к теме топика не относится - это authenticode signature. Выполняется утилитами идущими в поставке почти всех девелоперских продуктов мс... подпись в лоб в использованием мастера и сертификата, который я выкладывал для примера тут ранее (у сертификата должна быть включена KU = Code sign или область использования неограниченна), с ком.строки запускаю:
Код: plaintext
signtool.exe signwizard
по завершению работы мастера, ответив на вопросы и указав файл и сертификат для подписи получаем
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35310866
renaton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Альт renatonТак может вот этот скриншот пояснит мой вопрос, это свойтсва инсталлятора АдобеРидер 8

Зачем вы оверкворите.. неудобно же читать. То, что вы хотите... к теме топика не относится - это authenticode signature. Выполняется утилитами идущими в поставке почти всех девелоперских продуктов мс... подпись в лоб в использованием мастера и сертификата, который я выкладывал для примера тут ранее (у сертификата должна быть включена KU = Code sign или область использования неограниченна), с ком.строки запускаю:
Код: plaintext
signtool.exe signwizard
по завершению работы мастера, ответив на вопросы и указав файл и сертификат для подписи получаем

А где достать signtool.exe? В поставке делфи он есть?
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35310938
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
renatonА где достать signtool.exe? В поставке делфи он есть?
Ну, имя тоже может отличаться (например signcode.exe)... не знаю про дельфи... потому утверждать не буду. Список, куда конкретно включены SignTool ищите в msdn, глянул каталоги... у меня на девелоперской машине они продублированы в куче мест... Microsoft SDK/Microsoft.NET 1.1/Microsoft.NET 2.0 и т.д.
поколупайтесь в bin каталогах эмсишных продуктов... первое же найденное:
Код: plaintext
C:\Program Files\Microsoft.NET\SDK\v1.1\Bin\signcode.exe
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35390491
LimonFX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vovankaты прогу домучал?
Прогу домучал. Вроде всё работает.
Если есть вопросы то чем смогу, помогу. Но это было так давно, что я уже успел немного позабыть и уволится из того банка в котором писал эту программку, не знаю какова её судьба, но для себя исходнички успел скопировать :)
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35459440
vovanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
дай почитать пожалуста, для само образования:))
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35956563
_test_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LimonFXC предыдущим вопросом я уже разобрался - сертификат находит.

Ребят, такая же проблема. выложил вопрос здесь:

http://programmersforum.ru/showthread.php?t=47254

http://www.cyberforum.ru/win-api/thread31754.html

http://forum.vingrad.ru/forum/topic-257177/kw-certfindcertificatei-%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82.html

http://www.cryptopro.ru/cryptopro/forum2/default.aspx?g=posts&t=1319

ПОМОГИТЕ ПОЖАЛУЙСТА!
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35957095
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О... Томск... единственный, известный мне город, где есть маршрутка двигающаяся со Спичечной фабрики на Карандашную ) один из самых любимых городов ) еще неделю назад я бы помог разобраться... сидя в том же лагерном... без всяких проблем )
Вопрос сишный и это первое... CertOpenStore без "MY_ENCODING_TYPE" и с закомментированным enc.type... на глаз мало чего ловится... покажите сертификат
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #35957517
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то я вчера больше о Томске мечтал... чем на код смотрел )
В общем, нормальный код... насколько он может быть нормальным для си )... соорудил пробник (в приложении сертификат с RDN CN='Gafarov_Artur') и запихнул его в личные... проверяю кодом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
 const 
  CN = 'Gafarov_Artur';
  CERT_STORE_NAME = 'MY';
  CRYPTO_ENCODING_TYPE : DWORD = PKCS_7_ASN_ENCODING  or  X509_ASN_ENCODING;
 var 
  hStore : HCERTSTORE;
  pCert : PCCERT_CONTEXT;
 begin 
  hStore := CertOpenSystemStore(  0 , CERT_STORE_NAME );
   if  CryptoCheck( hStore <>  0  )  then 
   try 
    pCert := CertFindCertificateInStore( hStore, CRYPTO_ENCODING_TYPE,  0 ,
      CERT_FIND_SUBJECT_STR, CN,  nil  );
     if  CryptoCheck( Assigned( pCert ))  then 
     try 
     // 
     // Работаем с сертификатом 
     // 
     finally 
      CryptoCheck( CertFreeCertificateContext( pCert ));
     end ;
   finally 
    CryptoCheck( CertCloseStore( hStore, CERT_CLOSE_STORE_CHECK_FLAG ));
   end ;
 end ;

все работает, все находит... попробуйте моим вариантом, через CertOpenSystemStore и моим же сертификатом.
зы: есть еще мысли про printableString в вашем RDN и допустимых символов в значении ('_' не входит в их число), но тут надо видеть ваш сертификат. Чем вы его сооружали?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как сделать цифровую подпись на основе сертификата
    #36617647
LimonFX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О! Моя первая тема на sql.ru :) Помню тогда сильно погрузился в эту задачу, недели на две. Очень помогли примеры на msdn'e. Там правда код на Си, но на delphi с легкостью можно самому переписать.
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #36678319
frozzen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Альт, спасибо!
коды в теме полезные
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #36834495
_Сыр_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да... Ребята... Тема интересная... Жаль что я ее смотрю ))
Подскажите с чего начать?.. Допустим какие компоненты должны быть на 12 дельфе, библиотеки?
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #36835711
one123456
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Люди, подскажите, как получить данные о сертификате, который находится в контейнере. Ну или ссыли, чет я уже совсем подзадолбался.
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #36907166
Гвость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дабы не плодить тему...

Нужно подписать сертификатом файл.

Мой код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
 procedure  TForm1.btnSignClick(Sender: TObject);
 Const 
  CERT_STORE_NAME = 'MY';
  MY_ENCODING_TYPE = PKCS_7_ASN_ENCODING  or  X509_ASN_ENCODING;
 var 
  wsFind : WideString;
  CertStore: HCERTSTORE;
  Cert:  PCERT_CONTEXT;

  SigParams: CRYPT_SIGN_MESSAGE_PARA;

  strMessage:  String ;
  strSize: DWORD;

  SignedBlob: CRYPT_DATA_BLOB;
  SignedSize: DWORD;
 begin 
   //Хранилище 
  CertStore := CertOpenSystemStore(  0 , 'MY');
   if  CertStore =  nil   then  exit;

   //Сертификат 
  wsFind := 'ТЕСТ';
  Cert := CertFindCertificateInStore(CertStore, PKCS_7_ASN_ENCODING  or  X509_ASN_ENCODING,
   0 , CERT_FIND_SUBJECT_STR, PWideString(wsFind),  nil );
   if  Cert =  nil   then  exit;

   //Данные которые подписываем 
  strMessage := '123';
  strSize :=  3 ;

      SigParams.cbSize := SizeOF(CRYPT_SIGN_MESSAGE_PARA);
      SigParams.dwMsgEncodingType := MY_ENCODING_TYPE;
      SigParams.pSigningCert := Cert;
      SigParams.HashAlgorithm.pszObjId := szOID_PKCS_7;
      SigParams.HashAlgorithm.Parameters.cbData :=  0 ;
      SigParams.cMsgCert :=  1 ;
      SigParams.rgpMsgCert := @Cert;
      SigParams.cAuthAttr :=  0 ;
      SigParams.dwInnerContentType :=  0 ;
      SigParams.cMsgCrl :=  0 ;
      SigParams.cUnauthAttr :=  0 ;
      SigParams.dwFlags :=  0 ;
      SigParams.pvHashAuxInfo :=  nil ;
      SigParams.rgAuthAttr :=  nil ;

      SignedBlob.pbData :=  nil ;

       if  CryptSignMessage(@SigParams, False,  1 , @strMessage, @strSize, SignedBlob.pbData, SignedBlob.cbData)  then 
         begin 
          Memo1.Lines.Add('Размер: ' + intToStr(SignedBlob.cbData));
         end 
       else  Memo1.Lines.Add('False');

      FreeAndNil(SigParams);

      CertFreeCertificateContext(Cert);
      CertCloseStore(CertStore, CERT_CLOSE_STORE_CHECK_FLAG );
 end ;

Размер возвращается но после этого пол секунды спустя Эксес Виолешн... Если запускать не из Delphi прога просто закрывается...

для работы с cryptoAPI использую JwaWinCrypt.pas от JEDI

Код: plaintext
1.
2.
3.
 function  CryptSignMessage(pSignPara: PCRYPT_SIGN_MESSAGE_PARA;
  fDetachedSignature: BOOL; cToBeSigned: DWORD; rgpbToBeSigned: LPBYTE;
  rgcbToBeSigned: LPDWORD;  var  pbSignedBlob: LPBYTE;  var  pcbSignedBlob: DWORD): BOOL; stdcall;
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #36911159
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не спешите меня хоронить, я тут регулярно появлюсь.

Тут надо просто немного думать.
Код: plaintext
SigParams.HashAlgorithm.pszObjId := szOID_PKCS_7;
основа подписи - это хеш к данным (вычисленный по какому-то известному аглоритму), который на втором шаге шифруется приватным ключом пары. Разные провайдеры поддерживают разные наборы алгоритмов хеширования. Вот этой строчкой и задается алгоритм хеша. Перечитайте топик, ведь это обсуждалось c LimonFX еще в 2007 году.

Код: plaintext
FreeAndNil(SigParams);
SigParams - это структура, а не объект и этот код никогда не откомпилируется. И SignedBlob тоже структура. Их элементарно надо занулить перед использованием. Как-то вот так.
Код: plaintext
1.
FillChar(SigParams, SizeOf(SigParams),  0 );
FillChar(SignedBlob, SizeOf(SignedBlob),  0 );
Можно смело воткнуть в самое начало функции.
Да и телепаты подсказывают, что у вас в SignedBlob мусор. Вызов CryptSignMessage должен быть двойным. На первом вы запрашиваете размер подписи, потом выделяете память, и лишь на повторном вызове получаете заветную подпись. Профит.
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #36912035
Гвость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Альт.

Сейчас если ставлю перед вызовом CryptSignMessage ваш код:
Код: plaintext
1.
FillChar(SignedBlob, SizeOf(SignedBlob),  0 );

или

Код: plaintext
1.
SignedBlob.cbData :=  0 ;

функция возвращает False. Но при этом приложение не падает.

Если перед вызовом CryptSignMessage не ставить вышеприведённый код. То при первом вызове функция возвращает размер:
Код: plaintext
1.
Memo1.Lines.Add('Размер: ' + intToStr(SignedBlob.cbData));

но сразу после вылетает...

с алгоритмом хеширования понятно:
Код: plaintext
1.
SigParams.HashAlgorithm.pszObjId := szOID_RSA_SHA1RSA;

теперь так... посмотрел в сертификате "алгоритм подписи".
...
Рейтинг: 0 / 0
Как сделать цифровую подпись на основе сертификата
    #36912638
Гвость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GetLastError даёт 5... ERROR_ACCESS_DENIED
...
Рейтинг: 0 / 0
25 сообщений из 128, страница 4 из 6
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сделать цифровую подпись на основе сертификата
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]