2

我正在尝试使用 C/C++ 以编程方式在 Windows 中创建一个新的证书存储。

我从这个函数 - 开始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++ 创建新证书存储的正确方法是什么?

请随时指出代码中的任何错误。

4

2 回答 2

1

CryptAcquireContext可以创建一个密钥容器。密钥容器与证书存储不同。

要创建证书存储,请使用CertRegisterPhysicalStoreCertRegisterSystemStore

于 2013-12-30T12:17:50.323 回答
0

查看我正在处理的一个代码库中的一个函数,我认为它正在创建一个商店。所以我用那个函数写了一个小代码片段,瞧——商店正在创建。

功能: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”被列出。

Ben 的回答也是正确的,我想说它更可取,因为该功能专门处理注册证书存储。

于 2013-12-31T07:11:16.880 回答