c# - 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 这样的混乱/不安全的解决方案。
很高兴听到任何人的任何想法。让我知道我是否可以提供更多信息。
解决方案
我遇到了完全相同的问题。对我来说,问题是部分使用私钥的顺序,部分是在导出调用中使用正确的参数。我的解决方案如下所示:
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"
是注明的……据我所知,无处。我在这里找到了。
推荐阅读
- python - tkinter 在 Windows 10 上的 CMD 中运行
- c++ - C ++如何正确将此代码实现到堆中
- selenium - Jenkins:ChromeDriver 从 shell 脚本更新 PATH 并使用新版本
- swift - Swift/FireStore - 在固定路径添加和更新子集合
- r - 如何计算 tibble 或数据框中的值以生成新的输出表?
- r - R:删除“。” 和数据框中年份列中的 0
- python - 一个类的每个python对象在创建后都具有相同的属性值
- python - 有没有更简单的方法来解决这个问题?
- reactjs - custom-cra - 当前未启用对实验语法“jsx”的支持
- java - 对导致服务器因“打开的文件过多”而挂起的 Java 程序进行故障排除