2015-05-08 4 views
12

Sto utilizzando la classe This GoogleJsonWebToken per generare un token di accesso da utilizzare con le chiamate JSON all'API di Google Calendar. Funziona perfettamente bene in IIS espresso sulla mia macchina dev quando uso il seguente (usando il mio servizio effettivo account di posta elettronica):Errore 502 durante la generazione di X509Certificate2 dal certificato p12 nei siti Web di Azure per l'API di Google

string p12Path = HttpContext.Current.Server.MapPath("~/App_Data/certificate.p12"); 
var auth = GoogleJsonWebToken.GetAccessToken("[email protected]", 
              p12Path, 
              "https://www.googleapis.com/auth/calendar"); 
string Token = auth["access_token"]; 

di testare questo sto solo chiamando @Token a mio avviso cshtml rasoio. Quando lo pubblico sul mio sito Web di Azure, non funziona. Se lascio la classe GoogleJsonWebToken non modificata ottengo uno 502 - Web server received an invalid response while acting as a gateway or proxy server. molto inutile senza altre informazioni.

Dopo alcune ricerche su Google, ho trovato this SO post che è un problema simile. Così ho provato la loro soluzione ottengo System.Security.Cryptography.CryptographicException: The system cannot find the file specified. quando viene eseguito dal mio sito Web di Azure. Quando viene eseguito dalla mia macchina di sviluppo ottengo System.Net.WebException: The remote server returned an error: (400) Bad Request. che penso sia perché con quella soluzione lo è null mentre la classe originale non modificata quando viene eseguita sulla mia macchina di sviluppo mi dà qualcosa come {C0E26DC5-5D2C-4C77-8E40-79560F519588} che viene generata casualmente ogni volta e questo valore viene utilizzato nel processo di firma della firma.

Ho quindi trovato this SO post ma questa soluzione ha prodotto gli stessi risultati dell'ultima soluzione.

Ho anche provato la maggior parte delle diverse combinazioni di X509KeyStorageFlags inutilmente.

Come posso generare lo CspKeyContainerInfo.KeyContainerName da solo o altrimenti generare correttamente lo X509Certificate2?

risposta

20

Ho trovato la soluzione su this MSDN forum post. Fondamentalmente avevo bisogno di impostare X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet come ho letto nel primo post SO che ho citato e quindi avevo bisogno di Flags = CspProviderFlags.UseMachineKeyStore nel mio CspParamaters.

Ho inviato il mio full solution on GitHub

+0

Sì, questo lo ha fatto per me – NicoJuicy

+0

Esattamente lo stesso problema. Sostituzione di X509KeyStorageFlags.DefaultKeySet con X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet ha fatto il trucco. Molte grazie. – JCallico

-1

In primo luogo, è necessario aggiungere il file p12 alle risorse:

Fare clic destro sul progetto - proprietà - risorse - aggiungere risorse e dopo che l'uso questa riga di codice per la certificato

var certificate = new X509Certificate2((byte[])Properties.Resources.ResourceManager.GetObject(ResourceName), "!password!", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);