代码之家  ›  专栏  ›  技术社区  ›  Ben Scheirman

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

  •  2
  • Ben Scheirman  · 技术社区  · 17 年前

    我们的web服务围绕着一个包含以下代码的第三方库。

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

    C: \文档和设置\所有用户\应用程序 数据\微软\加密\ RSA \机器密钥。

    代码:

    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有一个未找到的文件,随后又出现了另一个成功 完全相同的文件 .

    我受不了了,有人知道我们为什么会看到这个吗?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Peter O. Manuel Pinto    14 年前

    我不知道是什么导致了错误,但您可以这样做,而不是对公钥进行xml编码和解码:

    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;
    

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

        2
  •  1
  •   Rasmus Faber    17 年前

    您之所以看到这种情况,是因为RSACryptoService提供程序在机器密钥存储上打开了一个独占锁。 无论您是否正在读取证书,使用该对象都会导致锁定

    有两种方法:

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

    我也遇到了同样的问题,最终编写了自己的RSA函数集。

    您还可以在ASP。NET池;这样,将使用用户配置文件密钥库

    推荐文章