CryptoAPI CryptImportKey失败并返回ERROR_INVALID_PARAMETER但导入密钥

时间:2012-04-23 18:46:32

标签: delphi winapi cryptography cryptoapi pkcs#12

我正在尝试从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指出我正确的方向。

1 个答案:

答案 0 :(得分:0)

您写道,您尝试从PKCS#12文件导入私有RSA密钥。在我看来,你应该使用PFXImportCertStore来做到这一点。导入模式可以找到here。如果您只需要获取私钥并将其保存在其他位置,则可以使用CertAddCertificateContextToStore替换为CertGetCertificateContextProperty的步骤。 PFXImportCertStore的调用会自动创建密钥容器 。将CertGetCertificateContextPropertyCERT_KEY_PROV_INFO_PROP_ID一起使用即可获得CRYPT_KEY_PROV_INFO提交的pwszContainerName密钥容器。