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 和互联网搜索,我检查了以下内容:
CNG Key Isolation和Remote Procedure Call (RPC)正在运行任何帮助,将不胜感激。
小题外话:在谷歌搜索这个问题的过程中,在SO和MSDN上找到了一个带有描述和方便的搜索工具的网站HRESULTHRESULT(我只是在谷歌上搜索了你的代码-2146893783)
我在 MSDN 上发现了一个主题,其中包含类似的失败代码HRESULT,作者提供了有关 CNG 的 MSDN 文章的链接:
NCRYPT_ALGORITHM_GROUP_PROPERTYL“算法组”
包含对象算法组名称的以 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,也许您只是使用可用列表中的另一种算法?您可以找到上面提到的那些:
其他开发人员在这里成功创建了其中之一并能够将其导出:
var cngKey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256, null,
new CngKeyCreationParameters { ExportPolicy = CngExportPolicies.AllowPlaintextExport });
Run Code Online (Sandbox Code Playgroud)