我正在尝试在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,
});

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


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)正在运行

  • 任何帮助,将不胜感激。

    最佳答案

    小题外话:在Google搜索此问题期间,在SO和MSDN上找到了a site with HRESULT descriptions和便捷的搜索工具(我只是用Google搜索您的HRESULT代码-2146893783)

    我发现了一个topic on MSDN,其中包含失败的代码,并带有类似的HRESULT,而作者提供了一个link to MSDN article about CNG:



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



    因此,正如您所说的,您只尝试了Sha1Sha256Sha512MD5,也许您只是使用了另一个algorithm from list available?您可以找到上面提到的那些:

  • RSA
  • ECDsa
  • P256
  • P384
  • P521
  • ECDiffieHellman
  • P256
  • P384
  • P521

  • Here other developers successfully created其中之一,并能够将其导出:
    var cngKey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256, null,
        new CngKeyCreationParameters { ExportPolicy = CngExportPolicies.AllowPlaintextExport });
    

    关于c# - CngKey.Create不支持请求的操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40912625/

    10-13 09:07