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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Murzilkberg  
#1 Оставлено : 25 апреля 2012 г. 18:38:17(UTC)
Murzilkberg

Статус: Участник

Группы: Участники
Зарегистрирован: 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 не хотят с ним работать. Заралась мысля що я гдето натупил Think . Но может вопрос стоит и в прототипе функции 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;

Подскажите ошибки...
Offline Murzilkberg  
#2 Оставлено : 25 апреля 2012 г. 23:20:42(UTC)
Murzilkberg

Статус: Участник

Группы: Участники
Зарегистрирован: 24.04.2012(UTC)
Сообщений: 12

Как не прискорбно но все работало и так, зря только много времени потрачено на поиск решения. При выводе в файл надо указывать не указатель на данные а сами данные:
Цитата:
mem.WriteBuffer(TempPFX.pbData^, TempPFX.cbData);
Offline Андрей Писарев  
#3 Оставлено : 26 апреля 2012 г. 0:22:45(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,190
Мужчина
Российская Федерация

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Murzilkberg написал:
Как не прискорбно но все работало и так, зря только много времени потрачено на поиск решения. При выводе в файл надо указывать не указатель на данные а сами данные:
Цитата:
mem.WriteBuffer(TempPFX.pbData^, TempPFX.cbData);



Внимательнее нужно быть Applause

пример же давался ранее

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)  | Причина: Не указана

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