| ||||
| ||||
Попробовал на дельфи использовать CAPICOM, выбираю сертификат и подписываю текст, в результате получаю SMIME текст. Затем этот же текст проверяю и получаю сабжевую ошибку, совершенно не могу понять почему. Может кто натупал на эти грабли раньше? Вот фрагменты кода: unction isSigVerified(TEXT: WideString): Boolean; //проверка подписи Var SignedData, Data: OleVariant; Begin SignedData:= CreateOLEObject(’CAPICOM.SignedData’); OleCheck(SignedData.Verify(TEXT, False, CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE)); Except on E:EOleSysError do if (e.ErrorCode <> CAPICOM_E_CANCELLED) then begin ShowMessage(’Трабла: ’+E.Message); Result:= False; Exit; end; End; Result:= True; End; Function FindCertificateByHash(szThumbprint: WideString): OLEVariant; Var MyStore, FilteredCertificates: OleVariant; Begin MyStore:= CreateOleObject(’CAPICOM.Store’); try MyStore.Open(CAPICOM_CURRENT_USER_STORE, ’My’, CAPICOM_STORE_OPEN_READ_ONLY); Except On E: EOleSysError do if (e.ErrorCode <> CAPICOM_E_CANCELLED) then begin ShowMessage(’Не могу открыть сертификат: ’+e.Message); Exit; end; End; FilteredCertificates := MyStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, szThumbprint); Result:=FilteredCertificates.Item[1]; MyStore := null; FilteredCertificates := null; End; function FilterCertificates: OleVariant; Var MyStore, FilteredCertificates: OleVariant; Begin MyStore:= CreateOleObject(’CAPICOM.Store’); FilteredCertificates:= CreateOleObject(’CAPICOM.Certificates’); try MyStore.Open(CAPICOM_CURRENT_USER_STORE, ’My’, CAPICOM_STORE_OPEN_READ_ONLY); Except on E: EOleSysError Do if (e.ErrorCode <> CAPICOM_E_CANCELLED) then begin ShowMessage(’Не могу открыть сертификат: ’+e.Message); Exit; end; End; FilteredCertificates:=MyStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_KEY_USAGE, CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE). Find(CAPICOM_CERTIFICATE_FIND_TIME_VALID). Find(CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY, 6); Result:=FilteredCertificates; MyStore := null; FilteredCertificates := null; end; ... procedure TForm1.SignButtonClick(Sender: TObject); var SignedData, Signer, TimeAttribute, szSignature, Cert: OLEVariant; begin Dytljhj;ybrb SignedData := CreateOleObject(’CAPICOM.SignedData’); Signer := CreateOleObject(’CAPICOM.Signer’); TimeAttribute:= CreateOleObject(’CAPICOM.Attribute’); if H=’’ Then ChooseSertButton.Click; SignedData.Content := Memo2.Text; Try Cert:=FindCertificateByHash(H); Signer.Certificate:=Cert; TimeAttribute.Name := CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME; TimeAttribute.Value:= NOW(); Signer.AuthenticatedAttributes.Add(TimeAttribute); // Подписываем документ и шифруем в SMIME szSignature := SignedData.Sign(Signer, true, CAPICOM_ENCODE_BASE64); SignedData.Verify(szSignature, False, CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE); //______________________Тут получаю: The hash value is not correct______________________ Memo1.Text:=szSignature; Except on E: EOleSysError Do if (e.ErrorCode <> CAPICOM_E_CANCELLED) then begin ShowMessage(’Запрос на сертификат был прерван пользователем: ’+E.Message); Exit; end; End; end; |