即使使用X509KeyStorageFlags.PersistKeySet,私钥也不会持久存在

时间:2010-12-09 02:02:32

标签: c# .net asp.net vb.net wcf

我现在已经搜索了很长一段时间,但我无法找到以下答案。我在Windows应用商店中存储密钥对,最近开始收到“密钥集不存在”错误。进一步调查我发现它可能是两件事,1 - 私钥不存储与持久密钥集属性(X509KeyStorageFlags.PersistKeySet)和2 - 密钥的访问权限。我在一台机器上尝试了1和2都没有成功(在我的机器上它显然有效)。奇怪的是,当我查看Microsoft \ Crypto \ RSA \ MachineKeys(和S-1-5-18)时,密钥仍然存在,但只有一段时间,然后它被删除,这意味着它不会持久存在。

//If decoded then save as RSACryptoServiceProvider
newCert.PrivateKey = DecodePrivateKey(privateKeyFile, pkPassword)

if (newCert.PrivateKey == null) throw new System.NullReferenceException("Decoded private key resulted in a null reference. Unable to store certificate.");

byte[] pfx = newCert.Export(X509ContentType.Pfx); newCert = new X509Certificate2(pfx, string.Empty, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);

我在IIS上托管的WCF服务上运行此代码,即使我通过MMC-CertMgr授予网络服务,AppPoolIdentity,我的帐户等权限,证书也会被删除。有人会知道为什么会这样吗?

提前致谢!

更新: 我今天刚刚发现,由于我通过WCF服务执行此操作,应用程序池在达到其空闲时间限制时正在删除私钥,因此我完全确定应用程序池是处理私钥的应用程序池这会导致从Microsoft \ Crypto \ RSA \ MachineKeys和S-1-5-18文件夹中删除密钥。今天我离开了一个测试运行,我禁用空闲时间从应用程序池关闭我仍然不确定私钥是否会停止重启或类似的东西?

有人知道如何让应用程序池停止删除我的私钥吗?

2 个答案:

答案 0 :(得分:0)

我不确定这个特殊情况,但是在工作中我们也遇到了在Web应用程序上下文中使用RSACryptoServiceProvider的问题。

为我们解决的问题是我们在相应的ApplicationPool上将“加载用户配置文件”设置为“true”。在我们的例子中,我们实际上遇到了PermissionDenied错误,因此不确定它是否适合您。

答案 1 :(得分:0)

可能不是最佳答案,但如果有人需要知道我的工作方式,那么将AppPoolIdentity设置为管理员帐户并将IIS中的“空闲超时(分钟)”值设置为0。只有这样,AppPool才会删除证书文件。