首页 > 解决方案 > IX509PrivateKey::C# 中的导出方法

问题描述

只是想知道使用过 Microsoft 证书注册 API 的人是否可以为此提供一些帮助。我正在尝试使用此处记录的 IX509PrivateKey::Export 方法:https ://msdn.microsoft.com/en-us/library/windows/desktop/aa379006%28v=vs.85%29.aspx?f= 255&MSPP错误=-2147217396

我调用此方法的 C# 代码如下所示:

privateKey.Export("BCRYPT_PRIVATE_KEY_BLOB", EncodingType.XCN_CRYPT_STRING_ANY);

不幸的是,这会返回一个错误:“参数不正确。0x80090027”</p>

该错误不是很有帮助,因为我不确定哪个参数导致了问题,因为它们都使用 API 文档中指定的值。请注意,在调用此代码之前,私钥已被初始化、创建,并可成功用于通过此 API 生成 CSR。

我在想这可能与将 C# 字符串转换为可与非托管代码一起使用的 BSTR 类型有关,因此我尝试了一些方法来测试该理论,但运气不佳。我有一种感觉,错误本身可能是由 CNG NCryptExportKey 函数生成的,该函数在此处记录:https ://msdn.microsoft.com/en-us/library/windows/desktop/aa376263%28v=vs.85% 29.aspx?f=255&MSPPError=-2147217396。如果可能的话,我想尽量避免像 P/Invoke 这样的混乱/不安全的解决方案。

很高兴听到任何人的任何想法。让我知道我是否可以提供更多信息。

标签: c#securityssl-certificate

解决方案


我遇到了完全相同的问题。对我来说,问题是部分使用私钥的顺序,部分是在导出调用中使用正确的参数。我的解决方案如下所示:

  CX509PrivateKey privateKey = new CX509PrivateKey();
  //these flags have to be set before the key is created-- they're read only afterward
  privateKey.KeyUsage = X509PrivateKeyUsageFlags.XCN_NCRYPT_ALLOW_ALL_USAGES;
  privateKey.ExportPolicy = X509PrivateKeyExportFlags.XCN_NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG;
  privateKey.Create();
  //initialize a request using the private key
  pkcs10.InitializeFromPrivateKey(X509CertificateEnrollmentContext.ContextUser, privateKey, templateName);
  //export the key, using the correct export type and encoding (I used the default)
  string exportedKey = privateKey.Export("PRIVATEBLOB"); 

请注意,传递给导出函数的参数"PRIVATEBLOB"是注明的……据我所知,无处。我在这里找到了。


推荐阅读