我们的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。
我不在这里,任何人都知道为什么我们会看到这个?
答案 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提供程序在计算机密钥存储区上打开了一个独占锁。 如果您正在阅读证书,使用对象导致锁定
并不重要围绕它的两种方式:
我遇到了同样的事情,最终编写了我自己的RSA功能集。
您还可以在ASP.NET池中设置用户配置文件关联;这样就可以使用用户配置文件密钥库