2015-12-02 13 views
8

Ho il mio X509Certificate memorizzato in un database (in byte[]) in modo che la mia applicazione possa recuperare il certificato e utilizzarlo per firmare i miei JWT.Impossibile accedere al privateKey del mio X509Certificate2 in Azure

Il mio x509Certificate è passato da un file .pfx che ho generato sulla mia macchina, ma ora si trova in un database come una stringa di byte.

La mia applicazione funziona perfettamente bene localmente quando lo eseguo. L'applicazione può creare correttamente un'istanza di X509Certificate2 e utilizzarla per le mie esigenze, tuttavia il problema sorge quando provo a utilizzarlo nella mia applicazione web azurewebsites.

in fondo non posso accedere variabile di istanza PrivateKey i certificati, ottengo un'eccezione

System.Security.Cryptography.CryptographicException: Keyset does not exist 

E sto ri-Instantiating il certificato con questo

var cert = new X509Certificate2(myCertInBytes, myCertPass, 
      X509KeyStorageFlags.PersistKeySet | 
      X509KeyStorageFlags.MachineKeySet | 
      X509KeyStorageFlags.Exportable); 

Sto usando ASPNET 5 rc1 -update1. Ho anche provato a farlo su una macchina diversa e funziona bene, ho solo questo problema quando pubblico su Azure. E per aggiungere anche qualcos'altro, questa applicazione funzionava quando stavo eseguendo lo stesso progetto che era in esecuzione usando la versione DNX beta7

Qualsiasi aiuto apprezzato.

+0

Sei sicuro che il certificato nel tuo database abbia incluso il set di chiavi private? Non è un certificato pubblico per caso, vero? –

+0

@ZainRizvi è sicuramente incluso, posso recuperare la chiave privata, (dal CERT X509 su DB di Azure) se eseguo la chiave localmente in locale. Tuttavia non può essere recuperato quando lo distribuisco in Azure. – Lutando

risposta

6

Il problema è che le app Web di Azure limitano l'accesso all'archivio delle chiavi private delle macchine, poiché si tratta di un ambiente di hosting condiviso e la macchina non è completamente proprietaria. Per ovviare al problema, puoi caricare un certificato. Questo post sul blog descrive le migliori pratiche su come farlo: https://azure.microsoft.com/en-us/blog/using-certificates-in-azure-websites-applications/

Si prega di notare che questo funziona solo per livello di base e superiore (non di livello libero o condiviso).

Ciò può anche essere eseguito da un file .cer come segue, tuttavia è opportuno notare che non si tratta di best practice poiché si sta memorizzando una credenziale sicura con il proprio codice, in un formato non sicuro.

public X509Certificate2 CertificateFromStrings(String certificateString64, String privateKeyXml) 
{ 
    try 
    { 
     var rsaCryptoServiceProvider = new RSACryptoServiceProvider(); 
     rsaCryptoServiceProvider.FromXmlString(privateKeyXml); 

     var certificateBytes = Convert.FromBase64String(certificateString64); 
     var x509Certificate2 = new X509Certificate2(certificateBytes); 
     x509Certificate2.PrivateKey = rsaCryptoServiceProvider; 

     return x509Certificate2; 
    } 
    catch 
    { 
     return null; 
    } 
} 
+0

Se la chiave privata deve essere altamente protetta, è possibile utilizzare Azure Key Vault. –

+0

La cosa è il mio codice usato per funzionare 4 giorni fa e ora non funziona. Quindi sono stato in grado di accedere alla chiave privata dei miei certificati 4 giorni fa ma non più. Ho optato per questa soluzione di risposte. Per essere onesti, vorrei che fosse ancora possibile su un piano gratuito in modo che i progetti mini-throw-away potessero essere ospitati e utilizzare ancora i certificati X509 per firmare le cose. Sono stato costretto ad aggiornare il mio piano tariffario per questa applicazione web. – Lutando

+0

Hai trovato una soluzione, @Lutando? Sto riscontrando lo stesso problema con Azure Key Vault. Il codice viene eseguito e funziona come previsto durante l'esecuzione sul mio localhost, ma lo stesso codice nel Servizio app di Azure non riesce a creare un'istanza di X509Certificate2 quando passano la password al costruttore e non. –

Problemi correlati