Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CryptoAPI - Найти сертификат в хранилище / 7 сообщений из 7, страница 1 из 1
15.04.2019, 17:27
    #39801688
SQL-Talker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Найти сертификат в хранилище
Пытаюсь найти в хранилище "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
15.04.2019, 17:49
    #39801703
Shuraken
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Найти сертификат в хранилище
Попробуйте пробежаться по хранилищу и отыскать нужный сертификат

Код: 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
15.04.2019, 18:19
    #39801709
SQL-Talker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - Найти сертификат в хранилище
Shuraken,

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

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


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