2009-07-09 13 views
14

Possiedo un'applicazione che utilizza RSACryptoServiceProvider per decrittografare alcuni dati utilizzando una chiave privata nota (memorizzata in una variabile).RSACryptoServiceProvider CryptographicException System Impossibile trovare il file specificato in ASP.NET

Quando il pool di applicazioni IIS è configurato per utilizzare il servizio di rete, tutto funziona correttamente.

Tuttavia, quando configuriamo l'IIS pool di applicazioni per eseguire il codice sotto una diversa identità, otteniamo la seguente:

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) 

Il codice è qualcosa di simile:

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 

ci sono risorse che tentano di rispondere affermando che si dovrebbe dare all'utente l'accesso in lettura all'archivio chiavi della macchina - tuttavia non esiste una risposta definitiva per risolvere questo problema.

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

risposta

9

Infatti è necessario lavorare un codice come questo

CspParameters _cpsParameter; 
RSACryptoServiceProvider RSAProvider; 

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

RSAProvider = new RSACryptoServiceProvider(1024, _cpsParameter); 

I seguenti utenti hanno bisogno di accedere alla cartella: C: \ Documents and Settings \ All Users \ Dati applicazioni \ Microsoft \ Crypto \ RSA \ MachineKeys

  1. account utente IIS (anonymmous)
  2. L'account utente utilizzato per impersonare l'applicazione nelle impostazioni web.config.

Quindi ora funziona bene per me.

+0

Grazie per la risposta - Non ho ancora avuto la possibilità di testarlo. Sai se i nuovi account per impostazione predefinita (clean windows install) hanno già accesso a questo? Stiamo cercando di evitare di dover modificare troppo - e questo sembra un problema particolarmente bizzarro per qualcosa che dovrebbe essere eseguito con fiducia bassa/media. –

+0

Will, non sono sicuro! Questo particolare problema è successo solo alla mia macchina. Ho provato su un'altra macchina per sviluppatori e le cose funzionano come dovrebbe. Nel server, i nostri sistemi funzionano in un contesto utente diverso, quindi non ho avuto problemi. –

8

Prova a impostare

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

EDIT: Quindi provare a utilizzare

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

al posto del costruttore con il parametro intero. Quel costruttore tenta di generare una chiave con la lunghezza della chiave specificata e potresti non essere in grado di farlo con le tue autorizzazioni.

+0

non ha cambiato nulla. –

+0

Questo ha funzionato per me su IIS7 con l'identità di apppool predefinita. –

+2

Sembra che puoi anche chiamare "nuovo RSACryptoServiceProvider (new CspParameters {Flags = CspProviderFlags.UseMachineKeyStore})" se non vuoi abilitare il flag a livello globale. –

28

Ho risolto il problema impostando "Carica profilo utente" su Vero (era Falso) nella sezione Impostazioni avanzate/modello del pool di applicazioni.

L'applicazione ha funzionato perfettamente su Server 2003 R2/IIS 6 e il problema è apparso mentre lo stavo configurando sul nostro nuovo server 2008 R2.

è venuta l'idea di provare a:

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

YMMV

+1

Questo ha funzionato per me, grazie! :) –

+0

Questo perché le chiavi sono memorizzate in DPapi http://security.stackexchange.com/q/1771/396 – LamonteCristo

+0

Grazie, ha funzionato per me sul server, ma non a livello locale, mi aggiro perché. Ho letto questa funzione tenta di accedere all'archivio chiavi e fallisce a causa delle autorizzazioni, anche se il codice non utilizza l'archivio chiavi. –

1

Volevo solo commentare che la soluzione di Rasmus Faber ha funzionato per me (con una sola modifica minore):

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

Stavo cercando di ottenere MailBee.net per firmare un messaggio in uscita usando DKIM e ottenuto lo stesso messaggio ricevuto dall'OP. Ovviamente tutto andava bene sulla mia macchina di sviluppo, ma durante il caricamento sul mio client web, mi sono imbattuto in questo problema. Come ho detto, la soluzione di cui sopra ha funzionato per me mentre altri che ho trovato online (incluso il link al forum msdn sopra) no.

(mi piacerebbe upvote e commentare, ma non ho abbastanza rep per farlo:. P)

Grazie Rasmus Faber!

Problemi correlati