2009-07-09 4 views
14

J'ai une application qui utilise RSACryptoServiceProvider pour décrypter certaines données en utilisant une clé privée connue (stockée dans une variable).RSACryptoServiceProvider CryptographicException System Impossible de trouver le fichier spécifié sous ASP.NET

Lorsque le pool d'applications IIS est configuré pour utiliser le service réseau, tout fonctionne correctement.

Cependant, lorsque nous configurons le pool d'applications IIS pour exécuter le code sous une autre identité, nous obtenons les suivantes:

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) 

Le code est quelque chose comme ceci:

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 

Il y a ressources qui tentent d'y répondre en indiquant que vous devez donner à l'utilisateur un accès en lecture au magasin de clés de l'ordinateur. Cependant, il n'existe aucune réponse définitive pour résoudre ce problème.

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

Répondre

9

En effet, vous devez travailler un code comme celui-ci

CspParameters _cpsParameter; 
RSACryptoServiceProvider RSAProvider; 

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

RSAProvider = new RSACryptoServiceProvider(1024, _cpsParameter); 

Les utilisateurs suivants ont besoin d'accéder au dossier: C: \ Documents and Settings \ All Users \ Application Data \ Microsoft \ Crypto \ RSA \ MachineKeys

  1. compte utilisateur IIS (de anonymement)
  2. Le compte d'utilisateur que vous utilisez pour usurper l'identité de votre application dans les paramètres web.config.

Alors maintenant, cela fonctionne très bien pour moi.

+0

Merci pour la réponse - Je n'ai pas encore eu l'occasion de le tester. Savez-vous si les nouveaux comptes par défaut (installation de Windows propre) ont déjà accès à cela? Nous essayons d'éviter d'avoir à modifier trop - et cela semble être un problème particulièrement important pour quelque chose qui devrait fonctionner avec une confiance faible/moyenne. –

+0

Will, je ne suis pas sûr! Ce problème particulier est arrivé à ma machine seulement. J'ai essayé dans une autre machine de développement et les choses fonctionnent comme supposé. Dans le serveur, nos systèmes fonctionnent sous un contexte utilisateur différent, donc je n'ai eu aucun problème aussi. –

8

Essayez de régler

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

EDIT: essayez d'utiliser

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

au lieu du constructeur avec le paramètre entier. Ce constructeur essaie de générer une clé avec la longueur de clé spécifiée, et vous ne pourrez peut-être pas le faire avec vos autorisations.

+0

cela n'a rien changé. –

+0

Cela a fonctionné pour moi sur IIS7 avec l'identité apppool par défaut. –

+2

Il semble que vous pouvez également appeler "new RSACryptoServiceProvider (new CspParameters {Flags = CspProviderFlags.UseMachineKeyStore})" si vous ne voulez pas activer l'indicateur globalement. –

28

J'ai corrigé cela en définissant "Load User Profile" sur True (était False) dans la section Advanced Settings/Process Model du pool d'applications.

L'application fonctionnait parfaitement sur Server 2003 R2/IIS 6 et le problème est apparu pendant que je le configurais sur notre nouveau serveur 2008 R2.

a eu l'idée de l'essayer à:

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

YMMV

+1

Cela a fonctionné pour moi, merci! :) –

+0

C'est parce que les clés sont stockées dans DPAPI http://security.stackexchange.com/q/1771/396 – LamonteCristo

+0

Merci, a travaillé pour moi sur le serveur, mais pas localement, je me balade pourquoi. J'ai lu cette fonction essaie d'accéder au magasin de clés et échoue en raison des autorisations, même si le code n'utilise pas besoin du magasin de clés. –

1

Je voulais juste commenter que la solution de Rasmus Faber a travaillé pour moi (avec un modifier mineur):

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

J'essayais d'obtenir MailBee.net pour signer un message sortant en utilisant DKIM et a reçu le même message que l'OP reçu. Bien sûr tout allait bien sur ma machine à dev, mais lors du téléchargement sur le web hôte de mes clients, j'ai rencontré ce problème. Comme je l'ai dit, la solution ci-dessus a fonctionné pour moi alors que d'autres que j'ai trouvé en ligne (y compris le lien du forum msdn ci-dessus) ne l'ont pas fait.

(j'upvote et de commentaires, mais je n'ai pas assez représentant de le faire. P)

Merci Rasmus Faber!

Questions connexes