Я пытаюсь создать новое хранилище сертификатов в 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 ++?
Пожалуйста, не стесняйтесь указывать на любые ошибки в коде.
CryptAcquireContext
Можно создать ключевой контейнер. Контейнер ключей — это не то же самое, что хранилище сертификатов.
Для создания хранилища сертификатов используйте CertRegisterPhysicalStore
или же CertRegisterSystemStore
,
Глядя на одну функцию в одной из кодовых баз, с которыми я имел дело, я подумал, что это создание магазина. Поэтому я написал небольшой фрагмент кода с этой функцией, и вот — магазин создается.
Функция: 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».
Ответ Бена также верен, и я бы сказал, что он предпочтительнее, поскольку эта функция специально предназначена для регистрации хранилищ сертификатов.