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

Уведомление

Icon
Error

4 Страницы123>»
Опции
К последнему сообщению К первому непрочитанному
Offline city-med.info  
#1 Оставлено : 26 июля 2025 г. 5:59:55(UTC)
city-med.info

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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;

Offline Андрей *  
#2 Оставлено : 26 июля 2025 г. 12:42:18(UTC)
Андрей *

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

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

Сказал «Спасибо»: 594 раз
Поблагодарили: 2323 раз в 1821 постах
Здравствуйте.

CryptAcquireContextA(hProv, PAnsiChar(ContainerName), PAnsiChar(ProvName), ProvType, CRYPT_DELETEKEYSET)
Техническую поддержку оказываем тут
Наша база знаний
Offline city-med.info  
#3 Оставлено : 26 июля 2025 г. 16:01:34(UTC)
city-med.info

Статус: Активный участник

Группы: Участники
Зарегистрирован: 25.03.2019(UTC)
Сообщений: 47
Российская Федерация
Откуда: Хабаровск

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 2 постах
Автор: Андрей * Перейти к цитате
Здравствуйте.

CryptAcquireContextA(hProv, PAnsiChar(ContainerName), PAnsiChar(ProvName), ProvType, CRYPT_DELETEKEYSET)



а как получить значение ContainerName из сертификата?
Offline Андрей *  
#4 Оставлено : 26 июля 2025 г. 16:14:41(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 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
Техническую поддержку оказываем тут
Наша база знаний
Offline city-med.info  
#5 Оставлено : 26 июля 2025 г. 17:05:31(UTC)
city-med.info

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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);


Offline Андрей *  
#6 Оставлено : 26 июля 2025 г. 17:28:31(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 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, а лучше забыть про эту реализацию.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#7 Оставлено : 26 июля 2025 г. 17:29:50(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 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;
Техническую поддержку оказываем тут
Наша база знаний
Offline city-med.info  
#8 Оставлено : 26 июля 2025 г. 17:40:32(UTC)
city-med.info

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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 в любых вариациях...
Offline city-med.info  
#9 Оставлено : 26 июля 2025 г. 17:49:31(UTC)
city-med.info

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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 ушла, но контейнер не удаляется.

Offline Андрей *  
#10 Оставлено : 26 июля 2025 г. 17:51:42(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 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
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
4 Страницы123>»
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.