2014-09-16 12 views
6

Mam aplikację konsolową zaplanowaną przy użyciu usługi WebJobs. Wykonanie zawsze kończy się niepowodzeniem podczas próby odczytania klucza prywatnego certyfikatu p12. Co ciekawe, nie mogę uchwycić wyjątku, musiałem użyć dobrego starego Console.WriteLine do debugowania.Niepowodzenie certyfikatu X509Certyfikat2 w interfejsie Azure Webjobs z interfejsem API Google

Oto mój fragment kodu:

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

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

Inne posty mają wspomnieć, że flagi powinny być X509KeyStorageFlags.MachineKeySet ale niestety to powoduje błąd w API Google. Wymaga to ustawienia flagi X509KeyStorageFlags.Exportable.

Czy ktoś może potwierdzić, że X509KeyStorageFlags.Exportable można używać na stronach internetowych Azure i WebJobs?

+0

Można znaleźć ten wątek pomocne: http://stackoverflow.com/questions/23330863/windows-azure-management-libraries - certyfikat-błąd w pracy w Internecie. –

+0

Tak, widziałem ten wątek i wpis na blogu. Rozwiązanie wymaga ustawienia 'X509KeyStorageFlags.MachineKeySet', który jest niezgodny z zestawem SDK Google API. –

Odpowiedz

12

Używanie X509KeyStorageFlags.Exportable nie nadaje się do użytku w IIS. Próbowałem już z Azure Webjobs, Azure Websites i IIS na mojej własnej wirtualnej maszynie. Działa w środowisku programistycznym podczas korzystania z IISExpress, ponieważ proces działa w kontekście użytkownika.

Tak więc do pracy w kontekście IIS (w tym Webjobs), musi być ustawiony na MachineKeySet, ale API Google nie powiedzie się, ponieważ potrzebuje klucza prywatnego.

Rozwiązanie mojego problemu było rzeczywiście bardzo proste, należy utworzyć aplikację konsoli, który tworzy obiekt X509Certificate2 z Exportable flagą, a następnie zadzwonić ToXmlString(). Oto fragment:

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

Następnie zapisz plik XML i korzystania z XML do tworzenia RSACryptoServiceProvider takiego:

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

nadzieję, że pomaga innym.

+0

Kocham was, inteligentnych ludzi, którzy wymyślają te rzeczy. Nie miałem nic do roboty :) Dzięki! – Olaj

+0

Podczas tworzenia obiektu X509Certificate2 odwołujesz się do 'danych', czy w jakiś sposób wyciągasz to z dostarczonego klucza .p12? –

+0

'dane' odnosi się do tablicy bajtów certyfikatu p12, który otrzymujesz z projektu Google Cloud dla poświadczeń OAuth. Zobacz dokument tutaj: [https://cloud.google.com/bigquery/authorization#service-accounts-server](https://cloud.google.com/bigquery/authorization#service-accounts-server) –

5

To rozwiązanie działało w środowisku Azure. Jednak znalazłem także jeden dla moich potrzeb, który był znacznie prostszy. Wystarczy dodać dodatkowe flagi tak wszyscy są zadowoleni ...

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

znalazłem this solution

+0

Witam, witam w SO. To powinno być komentarzem, a nie odpowiedzią. Możesz komentować, gdy zdobędziesz wystarczającą reputację. Dzięki. – Cthulhu

+0

Właściwie to jest odpowiedź. Teraz działa idealnie! dobra robota. – superbre

+0

Uzgodnione, inne rozwiązanie to geniusz, ale to działa i jest znacznie mniej pracy, to powinna być zaakceptowana odpowiedź –

Powiązane problemy