我正在尝试从PKCS#12文件导入私有RSA密钥。我正在使用OpenSSL来解析P12,然后我尝试使用CryptImportKey将密钥导入CSP(“标准”增强型RSA提供程序)。
当我使用CryptExportKey从CSP导出密钥时,我创建blob的方式与我得到的完全相同。
最后我不想使用任何会话加密,因为我只解析加密文件并将其存储到CSP中。 如果我使用
publickeystruc.aiKeyAlg := CALG_RSA_KEYX;
和
if not CryptImportKey(tmpprovider,addr(privkey),dwBlobLen,0,flags,hPubKey) then
errorCode := GetLastError;
(对于key参数为0)然后函数失败并且我得到ERROR_INVALID_PARAMETER错误。但是密钥被导入并且完全正常工作(我试图用它进行签名,如果它被标记为可导出,我就可以导出它。)
变量的声明如下:
hpubkey:PHCRYPTKEY;
privkey:privkeyblob;
,其中
HCRYPTKEY = ULONG;
PHCRYPTKEY = ^HCRYPTKEY;
其余的是整数和红衣主教......
问题解决了,这是一个非常愚蠢的错误。当我在函数的开始时将其归零时,我忘记取消引用最后一个参数,因此不是
hPubKey^:=0;
我有
hPubKey := 0;
感谢TLama指出我正确的方向。
答案 0 :(得分:0)
您写道,您尝试从PKCS#12文件导入私有RSA密钥。在我看来,你应该使用PFXImportCertStore来做到这一点。导入模式可以找到here。如果您只需要获取私钥并将其保存在其他位置,则可以使用CertAddCertificateContextToStore
替换为CertGetCertificateContextProperty
的步骤。 PFXImportCertStore
的调用会自动创建密钥容器 。将CertGetCertificateContextProperty
与CERT_KEY_PROV_INFO_PROP_ID
一起使用即可获得CRYPT_KEY_PROV_INFO提交的pwszContainerName
密钥容器。