在RSACryptoServiceProvider上找不到文件,服务帐户权限?

时间:2009-02-06 19:54:16

标签: .net cryptography certificate

我们的Web服务包含第三方库,其中包含以下代码。

我们在IIS 6应用程序池中使用Active Directory服务帐户(没有交互式登录功能)。我们的服务失败,错误“系统找不到指定的文件”。我们已将错误追溯到RSACryptoServiceProvider provider = new RSACryptoServiceProvider();。第三方程序集依赖于基于x509文件的证书进行加密,而服务帐户具有对keys文件夹的读/写访问权限。此外,服务帐户具有读取,写入,修改权限:

  

“C:\ Documents and Settings \ All Users \ Application   数据\微软\加密\ RSA \ MachineKeys的”。

代码:

StringBuilder builder = new StringBuilder(publicKeyData);
builder.Replace("-----BEGIN CERTIFICATE-----", "");
builder.Replace("-----END CERTIFICATE-----", "");
X509Certificate2 certificate = new X509Certificate2( Convert.FromBase64String(builder.ToString()));

string xmlString = certificate.PublicKey.Key.ToXmlString(false);

RSACryptoServiceProvider provider = new RSACryptoServiceProvider(); //BOOM
CspKeyContainerInfo containerInfo = provider.CspKeyContainerInfo;

provider.PersistKeyInCsp = false;
provider.FromXmlString(xmlString);
loadedKeys.Add(key, provider);
provider2 = provider;

我们破解了打开的FileMon,发现该AppPool有一个FILE NOT FOUND,然后是同一个文件的另一个SUCCESS。

我不在这里,任何人都知道为什么我们会看到这个?

2 个答案:

答案 0 :(得分:1)

我对导致错误的原因一无所知,但您可以这样做,而不是使用xml-encoding和-decoding公钥:

StringBuilder builder = new StringBuilder(publicKeyData);
builder.Replace("-----BEGIN CERTIFICATE-----", "");
builder.Replace("-----END CERTIFICATE-----", "");
X509Certificate2 certificate = new X509Certificate2( Convert.FromBase64String(builder.ToString()));

RSACryptoServiceProvider provider = 
  (RSACryptoServiceProvider) certificate.PublicKey.Key;

loadedKeys.Add(key, provider);
provider2 = provider;

如果你很幸运,这可以解决错误。

答案 1 :(得分:0)

您之所以看到此原因,是因为RSACryptoService提供程序在计算机密钥存储区上打开了一个独占锁。 如果您正在阅读证书,使用对象导致锁定

并不重要

围绕它的两种方式:

  1. 使用非Microsoft RSA堆栈。
  2. 访问对象时使用lock()。
  3. 我遇到了同样的事情,最终编写了我自己的RSA功能集。

    您还可以在ASP.NET池中设置用户配置文件关联;这样就可以使用用户配置文件密钥库