c#-尝试实例化新的RSACryptoServiceProvider时出现“键集不存在”
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-尝试实例化新的RSACryptoServiceProvider时出现“键集不存在”,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2842字,纯文字阅读大概需要5分钟。
内容图文
我正在尝试自动化证书的部署,包括管理私钥上的权限.使用这个question,我整理了一些代码,这些代码应该更新证书的权限:
public static SetPermissionsResult SetPermissions(X509Certificate2 certificate, string userName)
{
var account = new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null);
using (var store = new X509Store(StoreName.My, StoreLocation.LocalMachine))
{
store.Open(OpenFlags.MaxAllowed);
var newCertificate = store.Certificates.Find(X509FindType.FindBySerialNumber, certificate.SerialNumber, false)[0];
var rsa = newCertificate.PrivateKey as RSACryptoServiceProvider;
if (rsa == null)
{
return SetPermissionsResult.Failure;
}
rsa.PersistKeyInCsp = true;
var cspParams = new CspParameters(
rsa.CspKeyContainerInfo.ProviderType,
rsa.CspKeyContainerInfo.ProviderName,
rsa.CspKeyContainerInfo.KeyContainerName)
{
Flags =
CspProviderFlags.UseExistingKey
| CspProviderFlags.UseMachineKeyStore,
CryptoKeySecurity =
rsa.CspKeyContainerInfo.CryptoKeySecurity,
KeyNumber = (int)rsa.CspKeyContainerInfo.KeyNumber/*,
KeyPassword = password*/
};
cspParams.CryptoKeySecurity.AddAccessRule(
new CryptoKeyAccessRule(account, CryptoKeyRights.GenericRead, AccessControlType.Allow));
using (var rsa2 = new RSACryptoServiceProvider(cspParams))
{
}
return SetPermissionsResult.Success;
}
}
在使用(var rsa2 = new RSACryptoServiceProvider(cspParams))(在其中实例化新加密提供程序以保留新访问规则的位置)上读取的行上,我得到了CryptographicException“密钥集不存在”.
从经验中我知道,这通常意味着当前的安全上下文没有访问主键的权限.为了解决这种可能性,我做了以下工作:
>使用即时窗口中的System.Security.Principal.WindowsIdentity.GetCurrent()找出当前用户是什么
>确保用户在MMC管理单元中具有证书的“完全控制”权限(并再次确认我正在为其寻找合适的存储区)
>向所有人用户授予完全控制权限.
>尝试创建带有和不带有KeyPassword的CspParameters对象(您可以在此处看到注释).
我没主意.该证书是伪造的自签名测试证书,因此与链中缺少权限的其他证书无关.任何帮助,将不胜感激.
更新:
通过修改此步骤之前的证书安装标志,我已经能够执行此代码.现在,代码可以成功执行,但是在MMC中看不到可见的效果.
解决方法:
我或多或少地解决了这个问题.上面列出的用于管理权限的代码是正确的.有问题的是在添加证书之前启动证书的代码.常识性的方法如下所示:
var certificate = new X509Certificate2(bytes, password);
这样做的问题是,它不会导致私钥在存储中持久存在,而这是权限代码所依赖的(duh).为此,您需要像这样实例化要添加到商店的证书:
var certificate = new X509Certificate2(bytes, "password123", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
并像这样添加它:
using (var store = new X509Store(storeName, StoreLocation.LocalMachine))
{
store.Open(OpenFlags.MaxAllowed);
store.Add(certificate);
}
最终要点:MMC管理单元在显示更新的权限方面比较简单,即,即使实际上已更改,它也可能不显示新的权限.我到达了一切都能正常运行的地步,但没有意识到,因为MMC向我展示了与众不同.如果您怀疑自己所看到的内容,则关闭MMC并重新打开会强制刷新.
内容总结
以上是互联网集市为您收集整理的c#-尝试实例化新的RSACryptoServiceProvider时出现“键集不存在”全部内容,希望文章能够帮你解决c#-尝试实例化新的RSACryptoServiceProvider时出现“键集不存在”所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。