2009-07-09 7 views
14

Ich habe eine Anwendung, die den RSACryptoServiceProvider verwendet, um einige Daten mit einem bekannten privaten Schlüssel (der in einer Variablen gespeichert ist) zu entschlüsseln.RSACryptoServiceProvider CryptographicException System kann die unter ASP.NET angegebene Datei nicht finden

Wenn der IIS-Anwendungspool für die Verwendung des Netzwerkdienstes konfiguriert ist, läuft alles einwandfrei.

Wenn wir jedoch die IIS Application Pool führen Sie den Code unter einer anderen Identität zu konfigurieren, erhalten wir folgendes:

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) 

Der Code ist so etwas wie dieses:

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 

Es gibt Ressourcen, die versuchen, sie zu beantworten, indem Sie angeben, dass Sie dem Benutzer Lesezugriff auf den Computerschlüsselspeicher geben sollten - jedoch gibt es keine definitive Antwort, um dieses Problem zu lösen.

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

Antwort

9

der Tat müssen Sie wie diese in den Ordner

CspParameters _cpsParameter; 
RSACryptoServiceProvider RSAProvider; 

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

RSAProvider = new RSACryptoServiceProvider(1024, _cpsParameter); 

Die folgenden Benutzer benötigen Zugriff um einen Code arbeiten: C: \ Dokumente und Einstellungen \ All Users \ Anwendungsdaten \ Microsoft \ Crypto \ RSA \ Machine

  1. IIS-Benutzerkonto (anonymmous)
  2. Das Benutzerkonto Sie Ihre Anwendung in den web.config-Einstellungen verwenden, um Identitätswechsel.

So jetzt funktioniert es gut für mich.

+0

Danke für die Antwort - ich hatte bisher noch keine Gelegenheit, das zu testen. Weißt du, ob neue Accounts standardmäßig (saubere Windows-Installation) Zugriff darauf haben? Wir versuchen zu vermeiden, zu viel zu modifizieren - und das scheint ein besonders bizarres Problem für etwas zu sein, das unter geringer/mittlerer Vertrauenswürdigkeit laufen sollte. –

+0

Will, ich bin mir nicht sicher! Dieses spezielle Problem trat nur mit meiner Maschine auf. Ich habe einen anderen Entwickler-Rechner ausprobiert und die Dinge funktionieren so. Auf dem Server laufen unsere Systeme unter einem anderen Benutzerkontext, also hatte ich auch kein Problem. –

8

Versuchen Sie,

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

EDIT: versuchen Dann

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

anstelle des Konstruktor mit dem Integer-Parameter. Dieser Konstruktor versucht, einen Schlüssel mit der angegebenen Schlüssellänge zu generieren, und Sie können dies möglicherweise nicht mit Ihren Berechtigungen tun.

+0

es hat nichts geändert. –

+0

Dies funktionierte für mich auf IIS7 mit der Standard-Apppool-Identität. –

+2

Es scheint, dass Sie auch "new RSACryptoServiceProvider (new CspParameters {Flags = CspProviderFlags.UseMachineKeyStore})" aufrufen können, wenn Sie das Flag global nicht aktivieren möchten. –

28

Ich habe dies behoben, indem ich "Load User Profile" auf True (war False) im Abschnitt Advanced Settings/Process Model des Anwendungspools eingestellt habe.

Die Anwendung funktionierte perfekt auf Server 2003 R2/IIS 6 und das Problem trat auf, als ich es auf unserem neuen 2008 R2 Server konfigurierte.

hatte die Idee, es zu versuchen auf:

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

YMMV

+1

Das hat bei mir funktioniert, danke! :) –

+0

Dies ist, weil die Schlüssel in DPAPI gespeichert sind http://security.stackexchange.com/q/1771/396 – LamonteCristo

+0

Danke, arbeitete für mich auf dem Server, aber nicht lokal, ich wandern warum. Ich lese diese Funktion versucht, auf den Schlüsselspeicher zugreifen und schlägt aufgrund von Berechtigungen fehl, obwohl der Code den Schlüsselspeicher nicht benötigt. –

1

Ich wollte nur anmerken, dass Rasmus Faber-Lösung für mich gearbeitet (mit einer kleineren edit):

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

Ich habe versucht, MailBee zu bekommen.net, um eine ausgehende Nachricht unter Verwendung von DKIM zu signieren, und erhielt die gleiche Nachricht, die das OP empfangen hat. Natürlich war alles in Ordnung auf meinem Dev-Rechner, aber beim Hochladen auf meinen Client-Webhost stieß ich auf dieses Problem. Wie ich schon sagte, die obige Lösung funktionierte für mich, während andere, die ich online fand (einschließlich des msdn forum-Links oben), dies nicht taten.

(ich würde upvote und kommentieren, aber ich habe nicht genug rep, dies zu tun. P)

Dank Rasmus Faber!