我正在尝试在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和互联网搜索,我检查了以下内容:
CNG Key Isolation
和Remote Procedure Call (RPC)
正在运行任何帮助都将不胜感激。
答案 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
因此,正如您已经说过您只尝试过Sha1
,Sha256
,Sha512
和MD5
,也许您只是使用了另一个{ {3}}?你可以找到上面提到的那些:
P521其中一个并且能够导出它:
var cngKey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256, null,
new CngKeyCreationParameters { ExportPolicy = CngExportPolicies.AllowPlaintextExport });