我使用certreq
创建了一个PKCS#10 CSR,并设置了选项Exportable=TRUE
。这会在位置REQUEST
下成功创建密钥。我还有MY
密钥的有效证书。如果我尝试访问其中任何一个,CryptoAPI会报告错误代码0x80090016
。
到目前为止,在不同的访问权限下运行无法解决此问题。
我的目标是同时获取MY
和REQUEST
中的密钥。如果我在其中任何一个上调用CryptAcquireContextA()
,它就会失败。
Windows 7 x64
我的完整代码如下所示:
hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A, 0, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE, "REQUEST");
pCert = CertFindCertificateInStore(hStore, X509_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR_A, "CERTIFICATE_SUBJECT", NULL);
CertGetCertificateContextProperty(pCert, CERT_KEY_PROV_INFO_PROP_ID, NULL, &len);
pinfo = (CRYPT_KEY_PROV_INFO *) malloc(len);
CertGetCertificateContextProperty(pCert, CERT_KEY_PROV_INFO_PROP_ID, pinfo, &len);
provname = wide_to_asc(pinfo->pwszProvName);
contname = wide_to_asc(pinfo->pwszContainerName);
if(!CryptAcquireContextA(&hCryptProv, contname, provname, pinfo->dwProvType, 0)) {
err = GetLastError();
fprintf(stderr, "Error: 0x%x\n", err);
}
CryptGetUserKey(hCryptProv, pinfo->dwKeySpec, &hUserkey);
此代码主要是从 OpenSSL capi引擎复制的。由于引擎失败,我创建了尽可能小的代码来搜索错误。
如果我运行它,则输出Error: 0x80090016
失败。根据{{3}},这意味着三件事之一:
Local Computer
经过一些谷歌搜索,我试图更改文件系统的权限。我通过查看代码的contname
变量并搜索文件找到了这些文件。我更改了对它们的权限(更准确,我更改了父文件夹的权限)。虽然这解决了MY
的问题,但似乎我无法更改REQUEST
。
这里需要注意的是MY
的容器似乎在这里:
%APPDATA%\Microsoft\Crypto\RSA\S-1-5-21-1650336054-1974872081-316617838-545102
对于REQUEST
我发现它位于不同的地址:
%ALLUSERSPROFILE%\Microsoft\Crypto\RSA\MachineKeys
我不确定这里的工作方式,所以我无法解释为什么它会将它们放在不同的位置(一个是以用户为中心,另一个是系统文件夹)。 MY
商店是使用常规管理员提示和命令certreq -new inf_file.inf cert-csr.csr
创建的,在我收到证书后,我发布了certreq -accept cert.pem
。然后我使用相同的命令创建了一个新的csr。
我尝试使用以下权限执行我的程序:
whoami
output)为了接收服务提示,我根据Microsoft的提示执行了psexec.exe –ids cmd.exe
如何进一步缩小此问题的任何帮助或指导将不胜感激。
答案 0 :(得分:1)
我终于能够解决这个问题了,它比我想象的要简单得多。我确信我会收到一个明确的容器名称,并且不需要更具体,但CryptAcquireContext
实际上要求我传递一个标记CRYPT_MACHINE_KEYSET
。
所以我的函数调用必须如下所示:
CryptAcquireContextA(&hCryptProv, contname, provname, pinfo->dwProvType, CRYPT_MACHINE_KEYSET)
不幸的是,OpenSSL引擎不支持此功能,因此您必须在引擎中自行更改它。
答案 1 :(得分:0)
请参阅MSDN:"只有创建密钥容器和本地系统帐户的用户才能访问非管理员用户在没有此标志的情况下创建的密钥容器。"
此处填写详细信息:https://msdn.microsoft.com/en-us/library/windows/desktop/aa379886(v=vs.85).aspx