Как я могу установить сертификат в хранилище доверенных издателей пользователя программным способом, используя API-интерфейсы Windows? - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть сертификат (файл X509 .cer), который мне нужно установить в хранилище доверенных издателей текущего пользователя, чтобы он отображался здесь в диспетчере сертификатов:

enter image description here

Я могу установить сертификат, дважды щелкнув по файлу .cer, а затем щелкнув мышью по некоторым диалоговым окнам.

Но мне нужно установить его программно, используя сырой Windows API.

Это более или менее тот же вопрос, что и этот вопрос SO , но для C или C ++ вместо C #.

1 Ответ

0 голосов
/ 24 сентября 2018

Это на самом деле довольно просто:

Следующий быстрый и грязный пример программы добавляет сертификат в файле cert.cer в хранилище сертификатов текущего доверенного пользователя "Trusted Publishers".

#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>

#pragma comment (lib, "crypt32.lib")

void MyHandleError(LPCTSTR psz)
{
  fprintf(stderr, TEXT("An error occurred in the program.\n"));
  fprintf(stderr, TEXT("%s\n"), psz);
  fprintf(stderr, TEXT("Error number %x.\n"), GetLastError());
  exit(1);
}

int main()
{
  HCERTSTOR hCertStore;

  if (hCertStore = CertOpenSystemStore(NULL, "TrustedPublisher"))
  {
    fprintf(stderr, "The %s store has been opened. \n", pszStoreName);
  }
  else
  {
    MyHandleError("The store was not opened.");
  }

  // Open and read certificat file
  HANDLE hfile = CreateFile("cert.cer", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

  if (hfile == INVALID_HANDLE_VALUE)
  {
    MyHandleError("File could not be opened.");
  }

  DWORD size = GetFileSize(hfile, NULL);

  if (size == INVALID_FILE_SIZE)
  {
    MyHandleError("GetFileSize failed.");
  }

  char *pFileContent = (char*)malloc(size);

  DWORD sizeread;
  ReadFile(hfile, pFileContent, size, &sizeread, NULL);
  CloseHandle(hfile);

  // pFileContent points to certificat bytes, size contains the certificat size

  if (!CertAddEncodedCertificateToStore(hCertStore, X509_ASN_ENCODING, 
                                         (const BYTE*)pFileContent, size,
                                         CERT_STORE_ADD_NEW,
                                         NULL)
     )
  {
    MyHandleError("CertAddEncodedCertificateToStore failed.");
  }

  free(pFileContent);      
  CertCloseStore(hCertStore, 0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...