Статус: Активный участник
Группы: Участники
Зарегистрирован: 25.03.2019(UTC) Сообщений: 47  Откуда: Хабаровск Сказал(а) «Спасибо»: 1 раз Поблагодарили: 2 раз в 2 постах
|
Всем добра!) условия: есть файловый контейнер на диске, есть установленный сертификат и закрытый ключ в хранилище Личное задача: удалить контейнер, соответствующий установленному сертификату на данный момент успешно удаляю сертификат из личного, но вот как удалить и контейнер с диска, пока не понял. Код:procedure TForm1.Test(Sender: TObject);
const ThumbForDel='0123456789ABCD'
var
hMyStore: Pointer;
pCertContext, pSignerCert: PCCERT_CONTEXT;
Thumb: string;
begin
// Open "MY" store
hMyStore := CertOpenStore(CERT_STORE_PROV_SYSTEM, X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,
0, CERT_SYSTEM_STORE_CURRENT_USER, PChar('MY'));
if hMyStore=nil then begin Memo1.Lines.Add('ошибка открытия хранилища сертификатов!'); Exit; end;
try
pCertContext := nil;
repeat
pCertContext := CertEnumCertificatesInStore(hMyStore, pCertContext);
if (pCertContext <> nil) then begin
pSignerCert := CertDuplicateCertificateContext(pCertContext);
Thumb:=GetCertificateThumb(pSignerCert);
If Thumb=ThumbForDel then begin
If CertDeleteCertificateFromStore(pSignerCert) then Memo1.Lines.Add('Thumb '+Thumb+'Deleted');
pCertContext := nil;
end;
if Assigned(pSignerCert) then CertFreeCertificateContext(pSignerCert);
end;
until (pCertContext = nil);
if Assigned(pCertContext) then CertFreeCertificateContext(pCertContext);
if hMyStore<>nil then CertCloseStore(hMyStore, 0);
except on E:Exception do ShowMessage('Error '+#13#10+E.Message); end;
end;
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,880   Сказал «Спасибо»: 594 раз Поблагодарили: 2323 раз в 1821 постах
|
Здравствуйте. CryptAcquireContextA(hProv, PAnsiChar(ContainerName), PAnsiChar(ProvName), ProvType, CRYPT_DELETEKEYSET) |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 25.03.2019(UTC) Сообщений: 47  Откуда: Хабаровск Сказал(а) «Спасибо»: 1 раз Поблагодарили: 2 раз в 2 постах
|
Автор: Андрей *  Здравствуйте. CryptAcquireContextA(hProv, PAnsiChar(ContainerName), PAnsiChar(ProvName), ProvType, CRYPT_DELETEKEYSET) а как получить значение ContainerName из сертификата?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,880   Сказал «Спасибо»: 594 раз Поблагодарили: 2323 раз в 1821 постах
|
Автор: city-med.info  Автор: Андрей *  Здравствуйте. CryptAcquireContextA(hProv, PAnsiChar(ContainerName), PAnsiChar(ProvName), ProvType, CRYPT_DELETEKEYSET) а как получить значение ContainerName из сертификата? CertGetCertificateContextProperty(Certificate, CERT_KEY_PROV_INFO_PROP_ID .. Выделить память, запросить, получить pwszProvName dwProvType pwszContainerName |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 25.03.2019(UTC) Сообщений: 47  Откуда: Хабаровск Сказал(а) «Спасибо»: 1 раз Поблагодарили: 2 раз в 2 постах
|
Автор: Андрей * 
CertGetCertificateContextProperty(Certificate, CERT_KEY_PROV_INFO_PROP_ID ..
данные получил, спасибо сейчас пытаюсь удалять контейнер, получаю AV Код:
var hProv: WCrypt2.PHCRYPTPROV;
begin
CryptAcquireContextA(hProv,
PAnsiChar('FAT12\BC1BBE2D_ЭЦП\pfx-57d0.000\7F77'),
PAnsiChar('Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider'),
80, CRYPT_DELETEKEYSET);
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,880   Сказал «Спасибо»: 594 раз Поблагодарили: 2323 раз в 1821 постах
|
Автор: city-med.info  Автор: Андрей * 
CertGetCertificateContextProperty(Certificate, CERT_KEY_PROV_INFO_PROP_ID ..
данные получил, спасибо сейчас пытаюсь удалять контейнер, получаю AV Код:
var hProv: WCrypt2.PHCRYPTPROV;
begin
CryptAcquireContextA(hProv,
PAnsiChar('FAT12\BC1BBE2D_ЭЦП\pfx-57d0.000\7F77'),
PAnsiChar('Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider'),
80, CRYPT_DELETEKEYSET);
смотреть внимательно модуль WCrypt2, а лучше забыть про эту реализацию. |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,880   Сказал «Спасибо»: 594 раз Поблагодарили: 2323 раз в 1821 постах
|
JwaWinCrypt Цитата:function CryptAcquireContextA; external advapi32 name 'CryptAcquireContextA';
function CryptAcquireContextA(var phProv: HCRYPTPROV; pszContainer: LPCSTR; pszProvider: LPCSTR; dwProvType: DWORD; dwFlags: DWORD): BOOL; stdcall; |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 25.03.2019(UTC) Сообщений: 47  Откуда: Хабаровск Сказал(а) «Спасибо»: 1 раз Поблагодарили: 2 раз в 2 постах
|
у меня юникодная среда, в Wcrypt2 вот так описаны функции function CryptAcquireContextW; external ADVAPI32 name 'CryptAcquireContextW'; function CryptAcquireContextW(phProv: PHCRYPTPROV; pszContainer: PWideChar; pszProvider: PWideChar; dwProvType: DWORD; dwFlags: DWORD): BOOL; stdcall; собственно, и параметры pwszContainerName и pwszProvName тоже PWideChar функцию удаления сейчас так переделал Код:
var ContainerData: PCRYPT_KEY_PROV_INFO;
ContainerData:=GetCertificateData(pSignerCert);
Memo1.Lines.Add(ContainerData.pwszContainerName);
Memo1.Lines.Add(ContainerData.pwszProvName);
CryptAcquireContextW(hProv, ContainerData.pwszContainerName,
ContainerData.pwszProvName, ContainerData.dwProvType, CRYPT_DELETEKEYSET);
FreeMem(ContainerData);
AV в любых вариациях...
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 25.03.2019(UTC) Сообщений: 47  Откуда: Хабаровск Сказал(а) «Спасибо»: 1 раз Поблагодарили: 2 раз в 2 постах
|
Автор: Андрей *  JwaWinCrypt Цитата:function CryptAcquireContextA; external advapi32 name 'CryptAcquireContextA';
function CryptAcquireContextA(var phProv: HCRYPTPROV; pszContainer: LPCSTR; pszProvider: LPCSTR; dwProvType: DWORD; dwFlags: DWORD): BOOL; stdcall; исправил описание CryptAcquireContextA как в вашем примере, AV ушла, но контейнер не удаляется.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,880   Сказал «Спасибо»: 594 раз Поблагодарили: 2323 раз в 1821 постах
|
Автор: city-med.info  Автор: Андрей *  JwaWinCrypt Цитата:function CryptAcquireContextA; external advapi32 name 'CryptAcquireContextA';
function CryptAcquireContextA(var phProv: HCRYPTPROV; pszContainer: LPCSTR; pszProvider: LPCSTR; dwProvType: DWORD; dwFlags: DWORD): BOOL; stdcall; исправил описание CryptAcquireContextA как в вашем примере, AV ушла, но контейнер не удаляется. Не нужно стесняться вызывать GetLastError + SysErrorMessage, если api выдаёт false |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close