Создать новое хранилище сертификатов в C / Stack Overflow

Я пытаюсь создать новое хранилище сертификатов в Windows программно, используя C / C ++.

Я начал с этой функцией — CryptAcquireContextи написал этот кусок кода:

#include<windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
HCRYPTPROV hCryptProvider;
PCWSTR DefaultContainerName = L"MyStoreName";
PCWSTR DefaultProviderName = MS_STRONG_PROV;
DWORD DefaultProviderType = PROV_RSA_FULL;
DWORD DefaultProviderFlags = CRYPT_MACHINE_KEYSET | CRYPT_SILENT | CRYPT_NEWKEYSET;

printf("%d\n", CryptAcquireContext(&hCryptProvider, DefaultContainerName, DefaultProviderName, DefaultProviderType, DefaultProviderFlags));

return 0;
}

Значения имени контейнера и имени провайдера были взяты из проектного документа, которому я должен следовать.

Я не знаю, является ли это правильным способом создания хранилищ, потому что после запуска и открытия оснастки «Сертификат» MMC я не вижу хранилище с заданным именем. Программа печатает 1 при первом запуске и 0 со второго раза.

Это правильный путь? Если да, почему я не вижу магазин в MMC? Если нет, как правильно создавать новые хранилища сертификатов с использованием C / C ++?

Пожалуйста, не стесняйтесь указывать на любые ошибки в коде.

2

Решение

CryptAcquireContext Можно создать ключевой контейнер. Контейнер ключей — это не то же самое, что хранилище сертификатов.

Для создания хранилища сертификатов используйте CertRegisterPhysicalStore или же CertRegisterSystemStore,

1

Другие решения

Глядя на одну функцию в одной из кодовых баз, с которыми я имел дело, я подумал, что это создание магазина. Поэтому я написал небольшой фрагмент кода с этой функцией, и вот — магазин создается.

Функция: CertOpenStore

Несмотря на его название, которое означает открытие магазина, он создал магазин, который я указал, если он не существует. В противном случае он бы открыл существующий магазин. (Я не нахожу никакой документации для этого).

Вот мой фрагмент кода:

#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>
using namespace std;

int main()
{
HCERTSTORE store = NULL;
LPCSTR StoreProvider = CERT_STORE_PROV_SYSTEM;
DWORD Flags = CERT_SYSTEM_STORE_LOCAL_MACHINE;
PCWSTR StoreName = L"MyStore";

store = CertOpenStore(StoreProvider, 0, NULL, Flags, (void *)StoreName);
if(store == NULL)
printf("Could not open store");

return 0;
}

Проверяя оснастку сертификата MMC после выполнения этого кода, я мог видеть список названий магазинов «Mystore».

Ответ Бена также верен, и я бы сказал, что он предпочтительнее, поскольку эта функция специально предназначена для регистрации хранилищ сертификатов.

0