RSACryptoServiceProvider CryptographicException系统无法找到ASP.NET下指定的文件

时间:2009-07-09 09:48:11

标签: .net asp.net cryptography application-pool

我有一个应用程序正在利用RSACryptoServiceProvider使用已知的私钥(存储在变量中)来解密某些数据。

当IIS应用程序池配置为使用网络服务时,一切运行正常。

但是,当我们将IIS应用程序池配置为在不同的标识下运行代码时,我们会得到以下结果:

System.Security.Cryptography.CryptographicException: The system cannot find the file specified.

   at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
   at System.Security.Cryptography.RSACryptoServiceProvider.ImportParameters(RSAParameters parameters)
   at System.Security.Cryptography.RSA.FromXmlString(String xmlString)

代码是这样的:

byte[] input; 
byte[] output; 
string private_key_xml; 

var provider = new System.Cryptography.RSACryptoServiceProvider(this.m_key.Key_Size);
provider.FromXmlString(private_key_xml); // Fails Here when Application Pool Identity != Network Service

ouput = provider.Decrypt(input, false); // False = Use PKCS#1 v1.5 Padding

有些资源试图通过声明您应该授予用户对机器密钥库的读取权限来尝试回答它 - 但是没有明确的答案来解决此问题。

环境:IIS 6.0,Windows Server 2003 R2,.NET 3.5 SP1

5 个答案:

答案 0 :(得分:32)

我通过在应用程序池的高级设置/流程模型部分中将“加载用户配置文件”设置为True(为False)来修复此问题。

该应用程序在Server 2003 R2 / IIS 6上运行良好,问题出现在我在新的2008 R2服务器上进行配置时。

有想法尝试:

http://social.msdn.microsoft.com/forums/en-US/clr/thread/7ea48fd0-8d6b-43ed-b272-1a0249ae490f/

YMMV

答案 1 :(得分:10)

确实你需要像这样编写代码

CspParameters _cpsParameter;
RSACryptoServiceProvider RSAProvider;

_cpsParameter = new CspParameters();
_cpsParameter.Flags = CspProviderFlags.UseMachineKeyStore;

RSAProvider = new RSACryptoServiceProvider(1024, _cpsParameter); 

以下用户需要访问该文件夹:C:\ Documents and Settings \ All Users \ Application data \ Microsoft \ Crypto \ RSA \ MachineKeys

  1. IIS用户帐户(anonymmous)
  2. 用于在web.config设置中模拟应用程序的用户帐户。
  3. 所以现在它对我来说很好。

答案 2 :(得分:8)

尝试设置

System.Security.Cryptography.RSACryptoServiceProvider.UseMachineKeyStore = true;

修改 然后尝试使用

var provider = new System.Security.Cryptography.RSACryptoServiceProvider();

而不是带整数参数的构造函数。该构造函数尝试生成具有指定密钥长度的密钥,您可能无法使用您的权限执行此操作。

答案 3 :(得分:1)

我只是想评论Rasmus Faber的解决方案对我有用(只有一个小编辑):

System.Cryptography.RSACryptoServiceProvider.UseMachineKeyStore = true;
RSACryptoServiceProvider provider = new System.Cryptography.RSACryptoServiceProvider();

我试图让MailBee.net使用DKIM签署一个外发消息,并得到OP收到的相同消息。当然我的开发机器上的一切都很好,但是当我上传到我的客户端webhost时,我遇到了这个问题。就像我说的那样,上面的解决方案对我有用,而我在网上找到的其他解决方案(包括上面的msdn论坛链接)却没有。

(我赞成并发表评论,但我没有足够的代表这样做。:P)

谢谢Rasmus Faber!

答案 4 :(得分:0)

仅当我添加

Flags = CspProviderFlags.UseMachineKeyStore

为我解决了问题。

{
    string keyName = "Secret***";
    CspParameters parameters = new CspParameters()
    {
        KeyContainerName = keyName,
        Flags = CspProviderFlags.UseMachineKeyStore
    };
}