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

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

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

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

    我们正在使用IIS 6应用程序池中的Active Directory服务帐户(没有交互式登录功能)。我们的服务失败,出现错误_156;系统找不到指定的文件_。我们已将错误跟踪到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,注意到有一个文件找不到该应用程序池,接着是另一个成功的 相同的精确文件 .

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

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

    您之所以看到这一点,是因为rsacryptoService提供程序在计算机密钥存储上打开了一个独占锁。 如果您正在读取证书,使用对象会导致锁定,这无关紧要。

    有两种方法:

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

    我遇到了同样的事情,最后写了自己的RSA函数集。

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

        2
  •  1
  •   Rasmus Faber    15 年前

    我不知道是什么导致了错误,但您可以这样做,而不是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;
    

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