2009-02-06 255 views
2

我們的Web服務將包含包含以下代碼的第三方庫。在RSACryptoServiceProvider上找不到文件,服務帳戶權限?

我們在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和注意到,有沒有找到該應用程序池的文件時,緊接着又成功的完全相同的文件

我不在這裏了,有人有一個想法,爲什麼我們看到這個?

回答

0

您看到這種情況的原因是因爲RSACryptoService提供程序在計算機密鑰庫上打開排它鎖。 如果你正在閱讀的證書,使用對象導致鎖周圍

兩種方法沒關係:

  1. 使用非微軟的RSA堆棧。
  2. 訪問對象時使用lock()。

我遇到了同樣的事情,最後寫了我自己的RSA功能集。

您還可以在ASP.NET池中設置用戶配置文件關聯;這樣一個用戶配置文件密鑰庫將被用來代替

1

我沒有什麼導致錯誤的任何想法,但不是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; 

如果你是幸運的,那工程─圍繞着錯誤。

相關問題