Статус: Участник
Группы: Участники
Зарегистрирован: 24.04.2012(UTC) Сообщений: 12
|
Здравствуйте господа! Если можете, подскажите. Я работаю над программой на Delphi, для роботы с CryptoAPI использую библиотеку wcrypt2 (хотя многие на нее нарекают из-за неточности прототипов функций). Сейчас мне надо получить сертификат в формате pfx. Для этого я использовал следующий код Цитата: function TCertificateManager.ExportCertInPFX(FileName, Pass: string): Boolean; var TempPFX: CRYPT_DATA_BLOB; mem: TMemoryStream; cert: PCCERT_CONTEXT; begin if fConnected then begin mem := TMemoryStream.Create; try //cert:= CertEnumCertificatesInStore(fStore, nil); TempPFX.cbData := 0; TempPFX.pbData := nil; PFXExportCertStoreEx(fStore, @TempPFX, {PChar(Pass)}'1', nil, EXPORT_PRIVATE_KEYS); TempPFX.pbData := CryptMemAlloc(SizeOf(BYTE)*TempPFX.cbData); PFXExportCertStoreEx(fStore, @TempPFX, {PChar(Pass)}'1', nil, EXPORT_PRIVATE_KEYS); mem.WriteBuffer(TempPFX.pbData, TempPFX.cbData); mem.SaveToFile(FileName); except on E:Exception do MessageDlg('Error in ExportCertInPFX:'+#13#10+E.Message,mtError,[mbOK],0); end; mem.Free; end; end;
Перед этим я нашел сертификат и вывел нужную информацию о нем с помощью другой функции. Для поиска использовал код Цитата:cert:= CertFindCertificateInStore (fStore, fEncType, 0, CERT_FIND_SUBJECT_STR, PChar(Subject), nil); После выполнения первой функции создается файл но его содержимое не соответствует формату pfx, ни программа ASN.1 Editor ни openssl не хотят с ним работать. Заралась мысля що я гдето натупил  . Но может вопрос стоит и в прототипе функции PFXExportCertStoreEx. Так ка ее не было в wcrypt2 то ее я добавил сам вместе с функцией CryptMemAlloc Цитата:const EXPORT_PRIVATE_KEYS = $00000004; REPORT_NO_PRIVATE_KEY = $00000001; REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY = $00000002; // PKCS12_INCLUDE_EXTENDED_PROPERTIES = $00000010; PKCS12_EXPORT_RESERVED_MASK = $ffff0000;
function PFXExportCertStoreEx(hStore: HCERTSTORE; pPFX: PCRYPT_DATA_BLOB; szPassword:LPCWSTR; pvReserved: PVOID; dwFlags: DWORD):HRESULT ; stdcall;
function CryptMemAlloc(cbSize: ULONG):PVOID ; stdcall; Подскажите ошибки...
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 24.04.2012(UTC) Сообщений: 12
|
Как не прискорбно но все работало и так, зря только много времени потрачено на поиск решения. При выводе в файл надо указывать не указатель на данные а сами данные: Цитата:mem.WriteBuffer(TempPFX.pbData^, TempPFX.cbData);
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,190   Сказал «Спасибо»: 621 раз Поблагодарили: 2397 раз в 1886 постах
|
Murzilkberg написал:Как не прискорбно но все работало и так, зря только много времени потрачено на поиск решения. При выводе в файл надо указывать не указатель на данные а сами данные: Цитата:mem.WriteBuffer(TempPFX.pbData^, TempPFX.cbData); Внимательнее нужно быть пример же давался ранее http://www.cryptopro.ru/....aspx?g=posts&t=4599Андрей * написал:Murzilkberg написал:Если б Вы назвали функцию CryptoAPI которая позволит это сделать - буду благодарен. есть указатель на память и есть размер памяти, проблема сбросить на диск? причем здесь CryptoAPI ? Код:
M:=TMemoryStream.Create;
M.WriteBuffer( Certificate.pbCertEncoded^, Certificate.cbCertEncoded);
M.SaveToFile(SaveToFile);
Отредактировано пользователем 26 апреля 2012 г. 0:24:08(UTC)
| Причина: Не указана |
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close