【问题标题】:Create new certificate store in C/C++在 C/C++ 中创建新的证书存储
【发布时间】:2014-01-17 01:57:01
【问题描述】:

我正在尝试使用 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++ 创建新证书存储的正确方法是什么?

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

【问题讨论】:

  • "如果函数成功,则函数返回非零 (TRUE)。如果函数失败,则返回零 (FALSE)。有关扩展错误信息,请调用 GetLastError。"那么 GetLastError 返回什么?

标签: c++ c winapi creation certificate-store


【解决方案1】:

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

功能:CertOpenStore

尽管它的名字表示商店开业,但它创建了我指定的商店,如果它不存在的话。否则,它会打开现有的商店。 (我没有找到任何文档)。

这是我的代码 sn-p:

#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 的回答也是正确的,我想说它更可取,因为该函数专门处理注册证书存储。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢。也请检查我的答案。我意外地偶然发现了它。您能否简要解释一下密钥容器和证书存储之间的区别?
    • 密钥容器包含密钥,证书存储存储证书... :-) 。 . . .证书是一个公钥,以及有关谁拥有该密钥的信息,由另一个密钥进行数字签名。密钥容器可以保存公钥、私钥和对称密钥。密钥容器的工作是保护私钥和秘密密钥。证书存储的工作是保存可搜索和有组织的证书列表,并使其易于查找和访问。这样一来,他们就是对立的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 2012-02-20
    • 2010-09-23
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    相关资源
    最近更新 更多