powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CryptoAPI - Найти сертификат в хранилище
7 сообщений из 7, страница 1 из 1
CryptoAPI - Найти сертификат в хранилище
    #39801688
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь найти в хранилище "MY" сертификат по его Subject, но не получается...
Насколько я понимаю, хранилище "MY" это, то что обвязка certmgr.msc отображает внутри ветки "Личное" -> "Сертификаты".
У меня в этом хранилище есть два сертификата

Вот код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
var
  hCertStore: Pointer;
  pCertContext: PCCERT_CONTEXT;

  blob: CRYPT_HASH_BLOB;
  pCertSubject: PWideChar;
  subj: string;
begin
  // Open "MY" store
  hCertStore := CertOpenStore (
    CERT_STORE_PROV_SYSTEM,
    0,
    0,
    CERT_SYSTEM_STORE_CURRENT_USER,
    PChar('MY')
  );

  if hCertStore <> nil
  then Log('Store open: Success')
  else log('Store open: Fail');

  // search by Subject
  subj := 'MySert';  // реально тут мой логин - он указан в поле Subject обоих сертификатов

  GetMem (pCertSubject, 2 * length (subj) + 1);

  try
    StringToWideChar(subj, pCertSubject, 2 * length (subj) + 1);

    pCertContext := CertFindCertificateInStore(
      hCertStore,
      X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,
      0,
      CERT_FIND_SUBJECT_STR,
      pCertSubject,
      nil
    );
  finally
    FreeMem (pCertSubject, 2 * length (subj) + 1);
  end;

  if pCertContext = nil then
    Log('Certificate not found');
end;


pCertContext оказывается пустым ( nil )

В чем я лажаю?
...
Рейтинг: 0 / 0
CryptoAPI - Найти сертификат в хранилище
    #39801703
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте пробежаться по хранилищу и отыскать нужный сертификат

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
var
  hCertStore: Pointer;
  pCertContext, pSignerCert: PCCERT_CONTEXT;
  FStoreName: string;

function CertNameToWideString: WideString;
begin
  if (len = 0) then
  begin
    Result := '';
    Exit;
  end;

  SetLength(Result, len div 2);
  System.Move(CertName^, Pointer(Result)^, len);
  len := Length(Result);
  if (Result[len] = #0) then
  begin
    Dec(len);
    SetLength(Result, len);
  end;
end;

begin
  FStoreName := 'MY';
  hStoreHandle := CertOpenStore(CERT_STORE_PROV_SYSTEM, X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, nil, $00010000, PWideChar(WideString(FStoreName)));

  if hCertStore <> nil
  then Log('Store open: Success')
  else log('Store open: Fail');

  pCertContext := nil;
  repeat
    pCertContext := CertEnumCertificatesInStore(hStoreHandle, pCertContext);
    if (pCertContext <> nil) then
    begin
      pSignerCert := CertDuplicateCertificateContext(pCertContext);
      len := CertGetNameString(pSignerCert, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, nil, nil, 0);
      if len > 0 then
      begin
        len := len*2;
        GetMem(CertName, len);
        CertGetNameString(pSignerCert, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, nil, PWideChar(CertName), len);
        CrtName := CertNameToWideString;
        if CrtName = 'subj' then
        // делаем, что надо
      end;
    end;
  until (pCertContext = nil);

end;
...
Рейтинг: 0 / 0
CryptoAPI - Найти сертификат в хранилище
    #39801709
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shuraken,

Работает, спасибо ))
Еще бы понять почему у меня вариант с CertFindCertificateInStore не работает..
...
Рейтинг: 0 / 0
CryptoAPI - Найти сертификат в хранилище
    #39801710
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shuraken,

Нашел - проблема была в том что вторым параметром указывал 0
Указал "X509_ASN_ENCODING or PKCS_7_ASN_ENCODING" и заработало.
А я уж думал с при работе с поинтерами где-то лажа.
Спасибо еще раз ))
...
Рейтинг: 0 / 0
CryptoAPI - Найти сертификат в хранилище
    #39801725
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, к слову, вопрос. Может кто знает. Как можно сертификат из хранилища подключить к HTTP серверу Indy компонент? Просто локальный файл подключается без вопросов.
...
Рейтинг: 0 / 0
CryptoAPI - Найти сертификат в хранилище
    #39802427
Stranger484
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaonВот, к слову, вопрос. Может кто знает. Как можно сертификат из хранилища подключить к HTTP серверу Indy компонент? Просто локальный файл подключается без вопросов.
А что мешает взять контекст сертификата и сохранить его в файл?
...
Рейтинг: 0 / 0
CryptoAPI - Найти сертификат в хранилище
    #39803113
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да как-то костыльно на мой взгляд.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CryptoAPI - Найти сертификат в хранилище
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]