2015-09-22 23 views
7

Ho un file .p12 certificato e Creo il mio certificato in questo modo:"CryptographicException: Impossibile trovare l'oggetto richiesto", mentre il file del certificato esiste

var certificate = new X509Certificate2(certFileLocation, "mySecret", X509KeyStorageFlags.Exportable); 

Quando certFileLocation è sul mio tavolo e mi danno il percorso assoluto , il codice funziona. Ma quando ho messo l'intero contenuto del file .p12 in un nuovo file nella mia soluzione e impostare la proprietà Copy to Output Directory del file da "Copia se più recente" ottengo un'eccezione CryptographicException che dice:

Impossibile trova l'oggetto richiesto

Controllo anche ogni volta che il file è a posto e lo è. Qual è la differenza tra questi due scenari e perché non riesco a leggere il file con quest'ultimo approccio?

+0

Qual è il valore di 'certFileLocation'? Inoltre quando ottieni l'eccezione stai eseguendo, eseguendo il debug o testando (MSTest) il codice? –

+0

'certFileLocation' sarà la posizione del file' p12'. Questo succede quando eseguo il debug. – Disasterkid

risposta

0

Se si utilizza MS-test, è necessario un altro paio di bit:

  1. assicurarsi che il proprio runsettings sono configurati per NON eliminare le cartelle dopo i test sono completi se si desidera visualizzare alcun output di post il fatto; questo mi ha causato 30 minuti di tempo perso!
  2. aggiungere l'attributo DeploymentItem al numero TestMethod. questo viene copiato nella tua cartella Out.
  3. utilizzare la TestContext.DeploymentDirectory come cartella "root":

    X509Certificate2 GetCert() 
    { 
        var stx = File.Open(Path.Combine(TestContext.DeploymentDirectory, "thecertfile.pfx"), FileMode.Open); 
        using (BinaryReader br = new BinaryReader(stx)) 
        { 
         return new X509Certificate2(br.ReadBytes((int)br.BaseStream.Length), "password"); 
        } 
    } 
    
    [TestMethod, DeploymentItem("thecertfile.pfx")] 
    public void Signing_FlameTest() 
    { 
        var cert = GetCert(); 
        Assert.IsNotNull(cert, "GetCert failed"); 
    } 
    
3

Ho avuto un problema simile. Ha funzionato con un file fisso ma non ha funzionato con il file relativo ai miei test unitari. Questo era talmente misterioso che finalmente ho dato un'occhiata ai file e li ho confrontati con i binari. Loro dove non lo lo stesso. Sono stati letti e scritti come stringhe, il che li ha resi leggermente diversi a causa delle interpretazioni unicode. Quando li ho copiati da solo (da un resourcestream) come binario (byte []), tutto ha funzionato di nuovo. Spero che questo risolva anche il tuo problema.