2014-09-16 7 views
6

Ho un'app console pianificata tramite Azure WebJobs. L'esecuzione fallisce sempre quando si tenta di leggere la chiave privata del certificato p12. È interessante notare che non riesco a cogliere l'eccezione, ho dovuto usare il buon vecchio Console.WriteLine per eseguire il debug.X509Certificate2 non riuscito in Webjobs di Azure che chiama l'API di Google

Ecco la mia frammento di codice:

var certificate = new X509Certificate2(data, "notasecret", X509KeyStorageFlags.Exportable); 

ServiceAccountCredential credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(serviceAccountEmail) 
{ 
    Scopes = new[] { BigqueryService.Scope.Bigquery } 
}.FromCertificate(certificate)); 

Altri posti hanno menzione che le bandiere dovrebbero essere X509KeyStorageFlags.MachineKeySet ma purtroppo che causa un errore nel API di Google. Richiede l'impostazione del flag X509KeyStorageFlags.Exportable.

Qualcuno può confermare che X509KeyStorageFlags.Exportable sia utilizzabile su siti Web e WebJab di Azure?

+0

È possibile trovare questa discussione utile: http://stackoverflow.com/questions/23330863/windows-azure-management-libraries -Certificazione-error-il-web-lavoro. –

+0

Sì, ho visto quella discussione e il post sul blog. La soluzione richiede l'impostazione di 'X509KeyStorageFlags.MachineKeySet' che non è compatibile con l'SDK dell'API di Google. –

risposta

12

L'utilizzo di X509KeyStorageFlags.Exportable non è utilizzabile in IIS. L'ho provato con Azure Webjobs, siti Web di Azure e IIS sulla mia macchina virtuale. Funziona in un ambiente di sviluppo quando si utilizza IISExpress perché il processo è in esecuzione nel contesto dell'utente.

Quindi, poiché funziona in un contesto IIS (compresi i Webjob), deve essere impostato su MachineKeySet ma l'API di Google non funzionerà poiché richiede la chiave privata.

La soluzione al mio problema era in realtà piuttosto semplice, creare una console app che crea l'oggetto X509Certificate2 con Exportable flag impostato e quindi chiamare ToXmlString(). Ecco il frammento:

var certificate = new X509Certificate2(data, "notasecret", X509KeyStorageFlags.Exportable); var xml = certificate.PrivateKey.ToXmlString(true);

ho quindi salvare il XML e l'uso che XML per creare un RSACryptoServiceProvider come questo:

var rsa = new RSACryptoServiceProvider(); 
rsa.FromXmlString(xmlKey); 
ServiceAccountCredential credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(serviceAccountEmail) 
{ 
    Scopes = new[] { BigqueryService.Scope.Bigquery }, 
    Key = rsa 
}); 

Spero che questo aiuta gli altri.

+0

Ti amo gente intelligente che capisce queste cose. Non avevo niente da fare :) Grazie! – Olaj

+0

Si fa riferimento a 'data' quando si crea l'oggetto X509Certificate2, si estrae questo in qualche modo dal tasto .p12 fornito? –

+0

'data' fa riferimento a una matrice di byte del certificato p12 che si ottiene dal progetto Google Cloud per le credenziali OAuth. Dai un'occhiata al documento qui: [https://cloud.google.com/bigquery/authorization#service-accounts-server](https://cloud.google.com/bigquery/authorization#service-accounts-server) –

5

Questa soluzione ha funzionato in un'impostazione di Azure. Tuttavia ho trovato anche uno per i miei bisogni che era molto più semplice. Basta aggiungere Bandiere supplementari così tutti sono felici ...

var certificate = new X509Certificate2(data,"notasecret", 
         X509KeyStorageFlags.MachineKeySet | 
         X509KeyStorageFlags.PersistKeySet | 
         X509KeyStorageFlags.Exportable); 

ho trovato this solution

+0

Ciao, benvenuto in SO. Questo in realtà dovrebbe essere un commento, non una risposta. Puoi commentare una volta guadagnata abbastanza reputazione. Grazie. – Cthulhu

+0

In realtà, questa è la risposta. Ora funziona perfettamente! molto bene. – superbre

+0

D'accordo, l'altra soluzione è geniale ma questo fa il trucco ed è molto meno lavoro, questa dovrebbe essere la risposta accettata –

Problemi correlati