CngKey.Create不支持请求的操作

时间:2016-12-01 14:02:26

标签: c# .net .net-4.0 certificate self-signed

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

通过this question(特别是@dthorpe's answer)阅读,我决定尝试CLR Security

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

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,
});

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

  

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

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

  • 我正在运行Windows 7框(因此它支持按MSDN进行RPC)
  • 在Windows Server 2012框中尝试了同样的错误
  • 该进程以管理员身份运行(因此无论如何都可以访问所有证书存储)
  • 服务CNG Key IsolationRemote Procedure Call (RPC)正在运行

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

小偏离主题:在谷歌搜索此问题期间找到了a site with HRESULT descriptions和SO和MSDN上的便捷搜索工具(我只是用Google搜索了HRESULT代码-2146893783

我发现topic on MSDN包含代码失败的HRESULT代码,作者提供了link to MSDN article about CNG

  

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,也许您只是使用了另一个{ {3}}?你可以找到上面提到的那些:

P521其中一个并且能够导出它:

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