2

我们的 Web 服务包装了包含以下代码的第三方库。

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

“C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\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 。

我在这里没有我的元素,有人知道我们为什么会看到这个吗?

4

2 回答 2

1

我不知道是什么导致了错误,但是您可以这样做:

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;

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

于 2009-02-06T20:23:55.003 回答
0

您看到这个的原因是因为 RSACryptoService 提供程序在机器密钥存储上打开了一个排他锁。如果您正在阅读证书并不重要,使用该对象会导致锁定

解决方法有两种:

  1. 使用非 Microsoft RSA 堆栈。
  2. 访问对象时使用 lock()。

我遇到了同样的事情并最终编写了我自己的 RSA 函数集。

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

于 2011-10-19T02:51:47.473 回答