我们的 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 。
我在这里没有我的元素,有人知道我们为什么会看到这个吗?