CngKey.Create 不支持请求的操作

Din*_*nei 5 .net c# certificate .net-4.0 self-signed

我正在尝试在 C# 程序集(目标.NET 4.0)中即时(以编程方式)生成自签名证书,以作为根 CA 生成其他证书。该证书不需要保留在 Windows 证书存储中,我会将其导出为文件。

通过阅读这个问题(特别是,@ dthorpe的答案),我决定给一个尝试CLR安全

CLR Security库在CngKey 类上放置了一个扩展方法来生成自签名证书,但我无法成功创建CngKeywith的实例:

var key = CngKey.Create(CngAlgorithm.Sha1); //same with Sha256, Sha512 and MD5
//or
var key = CngKey.Create(CngAlgorithm.Sha1, null, new CngKeyCreationParameters()
{
    ExportPolicy = CngExportPolicies.AllowExport,
    KeyUsage = CngKeyUsages.AllUsages,
    KeyCreationOptions = CngKeyCreationOptions.MachineKey,
});
Run Code Online (Sandbox Code Playgroud)

这些行中的任何一行都会引发异常:

System.Security.Cryptography.CryptographicException 未处理
HResult=-2146893783
Message=不支持请求的操作。

Source=System.Core  
StackTrace:  
  at System.Security.Cryptography.NCryptNative.CreatePersistedKey(SafeNCryptProviderHandle provider, String algorithm, String name, CngKeyCreationOptions options)  
  at System.Security.Cryptography.CngKey.Create(CngAlgorithm algorithm,  String keyName, CngKeyCreationParameters creationParameters)  
  at System.Security.Cryptography.CngKey.Create(CngAlgorithm algorithm)  
  at Tests.Program.Main(String[] args) at Program.cs:line 51
Run Code Online (Sandbox Code Playgroud)

通过 SO 和互联网搜索,我检查了以下内容:

  • 我正在运行 Windows 7 机器(因此它支持MSDN 中的RPC )
  • 在 Windows Server 2012 机器上试过,同样的错误
  • 该进程以管理员身份运行(因此它可以访问所有证书存储)
  • 服务CNG Key IsolationRemote Procedure Call (RPC)正在运行

任何帮助,将不胜感激。

VMA*_*Atm 1

小题外话:在谷歌搜索这个问题的过程中,在SO和MSDN上找到了一个带有描述和方便的搜索工具的网站HRESULTHRESULT(我只是在谷歌上搜索了你的代码-2146893783


在 MSDN 上发现了一个主题,其中包含类似的失败代码HRESULT,作者提供了有关 CNG 的 MSDN 文章的链接

NCRYPT_ALGORITHM_GROUP_PROPERTY L“算法组”
包含对象算法组名称的以 null 结尾的 Unicode 字符串。此属性仅适用于键。Microsoft 密钥存储提供商返回以下标识符:

  • NCRYPT_RSA_ALGORITHM_GROUP
    "RSA",RSA算法组。
  • NCRYPT_DH_ALGORITHM_GROUP
    "DH",Diffie-Hellman算法组。
  • NCRYPT_DSA_ALGORITHM_GROUP
    "DSA",DSA算法组。
  • NCRYPT_ECDSA_ALGORITHM_GROUP
    "ECDSA",elliptic curve DSA算法组。
  • NCRYPT_ECDH_ALGORITHM_GROUP
    "ECDH",elliptic curve Diffie-Hellman算法组。

我还在 MSDN 上找到了一篇关于CNG Key Storage Providers 的文章,其中包含类似的算法列表:

  • Diffie-Hellman (DH)
    秘密协议和密钥交换,512 to 4096 in 64-bit increments
  • 数字签名算法(DSA)签名,512 to 1024 in 64-bit increments
  • 椭圆曲线 Diffie-Hellman (ECDH) 秘密协议和密钥交换,P256, P384, P521
  • 椭圆曲线数字签名算法 (ECDSA) 签名,P256, P384, P521
  • RSA非对称加密和签名,512 to 16384 in 64-bit increments

那么,正如您所说,您只尝试过Sha1Sha256Sha512MD5,也许您只是使用可用列表中的另一种算法?您可以找到上面提到的那些:

其他开发人员在这里成功创建了其中之一并能够将其导出:

var cngKey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256, null,
    new CngKeyCreationParameters { ExportPolicy = CngExportPolicies.AllowPlaintextExport });
Run Code Online (Sandbox Code Playgroud)