2012-04-20 11 views
5

Aktualnie pracuję nad automatycznym procesem wdrażania hostowanej usługi dla systemu Windows Azure. Tworzenie plików .cspkg i .cscfg działa idealnie, korzystając z połączenia z numerem msbuild. Teraz piszę małą aplikację konsolową .NET, która powinna wdrożyć te pliki na platformie Azure za pomocą interfejsu REST API zarządzania.Nie można uaktualnić wdrożenia platformy Azure za pomocą interfejsu REST API zarządzania (problem z certyfikatem SSL)

Nie ma problemu z samym API. Mogę wysłać żądanie do API przy użyciu jednego z moich certyfikatów zarządzania. Przesyłam plik .cspkg do magazynu Azure BLOB Storage, a następnie próbuję zadzwonić pod numer Upgrade Deployment. Ale za każdym razem, gdy próbuję, otrzymuję odpowiedź "400 nieprawidłowych żądań" stwierdzającą, że nie znaleziono certyfikatu z kodem odcisku xy. Ten certyfikat to certyfikat SSL (nie certyfikat zarządzania) Używam protokołu HTTPS dla mojej domeny niestandardowej (DNS CNAME).

A teraz cała sprawa robi się ciekawie:

Kiedy wdrożyć pliki za pomocą polecenia „Publikuj” w moim Visual Studio, nie ma problemu. (Porównałem pliki .cscfg/.cspkg z VS iz mojego wyjścia msbuild: oprócz kilku identyfikatorów GUID są identyczne). Co więcej, korzystając z funkcji zarządzania Silverlight w mojej przeglądarce, mogę nawet przesłać wygenerowane pliki, których nie można załadować za pomocą interfejsu API.

Po pobraniu listy wszystkich certyfikatów za pomocą wywołania List Certificates, certyfikat, który rzekomo zaginął, najwyraźniej istnieje. Mogę również pobierać dane za pomocą wywołania Get Certificate.

Dlaczego więc Azure ciągle mówi mi, że certyfikat nie został znaleziony podczas korzystania z połączenia Upgrade Deployment? Czy ktoś doświadczył czegoś podobnego? Czy ktoś ma dla mnie wskazówkę? Z góry dziękuję.

P.S .: To jest to, co mówi Azure podczas korzystania z API:

<Error xmlns="http://schemas.microsoft.com/windowsazure" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Code>BadRequest</Code> 
    <Message>The certitficate with thumbprint 7b232c4a2d6e3deadbeef120d5dbc1fe8049fbea was not found.</Message> 
</Error> 

P.P.S .: Tak, słowo w odpowiedzi jest certitficate, nie certificate.

Odpowiedz

4

Po użyciu funkcji API List Subscription Operations, aby dowiedzieć się, jakie wywołania programu Visual Studio uruchamiają aplikacje, znalazłem rozwiązanie.

Okazuje się, że adres URL Kiedyś na żądanie API było źle, ale : z całym szacunkiem, ale winię Microsoft dla lousily dokumentowania jej Azure Management API.

W ich dokumentacji piszą URL do wykorzystania jest:

https://management.core.windows.net/<subscription-id>/services/hostedservices/<service-name>/deploymentslots/<deployment-slot>/?comp=upgrade

a opis jest następujący:

Aby wygenerować żądania URI, wymienić < abonamentu id > z Twoim identyfikatorem subskrypcji, < nazwa usługi > z nazwą usługi, < gniazdo wdrażania > z inscenizacją lub produkcją oraz < nazwa wdrożenia > z unikalną nazwą wdrożenia.

Co oni zapomnieli wspomnieć, że trzeba używać nazw DNS swojej służby, a nie Nazwa! Mogą przynajmniej zwrócić odpowiedni komunikat o błędzie informujący, że nazwa usługi jest nieprawidłowa, nieistniejąca lub nie należy do Twojego identyfikatora subskrypcji, zamiast narzekać na problem z certyfikatem.

Dziękuję Microsoft, kosztowało mnie to więcej niż dwa dni.

+0

Ciekawi, ale jak sądzisz, jakie było imię Twojej usługi? Prywatny identyfikator i nazwa wdrożenia są wartościami Guid. Hosted Service name to rzeczywista wartość DNS (zawsze pisana małymi literami). Jakie jest inne nazwisko (etykieta?). Jeśli używasz UpgradeDeployment, potrzebujesz nazwy Deployment (GUID), w przeciwnym razie możesz użyć * BySlot i wskazać konkretny slot. – dunnry

+0

Nazwa usługi nie ma nic wspólnego z prywatnym identyfikatorem lub nazwą wdrożenia. Odnoszą się one do * wdrożenia * i zmieniają się po każdym utworzeniu nowego wdrożenia. Ale jak widać w dokumentach, API potrzebuje nazwy usługi, nawet jeśli chcę zaktualizować stanowisko instalacji lub wdrożenia, które mógłbym zidentyfikować przy użyciu identyfikatora GUID.Możesz także wywnioskować, że z wzorca URI podałem w mojej odpowiedzi, biorąc pod uwagę fakt, że nie ma żadnej opcjonalnej części w URI. Zobacz mój zrzut ekranu (http://dl.dropbox.com/u/17554533/azure.png), aby sprawdzić, co oznaczają dla mnie "nazwa usługi" i "nazwa DNS". – fero

+0

Pytam, którego nazwiska próbujesz użyć i jakie są jedyne możliwe kombinacje. Przypuszczam, że portal może być mylący. Na szczęście zawsze możesz użyć wyjścia API, by sterować wejściem i nie musisz zgadywać. – dunnry

0

Błąd wskazuje, że nie przesłałeś tego certyfikatu do tajnego magazynu hostowanej usługi. Visual Studio może robić to automagicznie dla ciebie, ale jeśli chcesz go replikować programowo, użyj funkcji API Dodaj certyfikat i prześlij PFX do wdrożenia.

+0

Certyfikat był zawsze obecny. W moim pytaniu napisałem, że pokazało to wywołanie "List Certificates". Prawdziwy problem można znaleźć w mojej własnej odpowiedzi. – fero

+0

Ciekawe, że można wywołać wdrożenie uaktualnienia na fałszywej nazwie hostowanej usługi i uzyskać ten błąd (z odpowiedzi poniżej). – dunnry

0

Możesz zobaczyć "400 BadRequest - Nie znaleziono certyfikatu z ksysem XYZ". pojawiają się w CreateDeployment lub scenariusza UpgradeDeployment z następującego powodu (co właśnie debugowanego):

  1. użyć tego samego certyfikatu zarządzania subskrypcji jak ty na przykład Szyfrowanie hasła SSL lub Remote Desktop w usłudze hostowanej. Dlatego będziesz używać certyfikatu z odciskami palca XYZ do uwierzytelnienia wywołania REST zarządzania usługami, które utworzy instalację.
  2. Określając parametry wdrażania Państwo przekazać w swojej CSCFG których odesłano tego samego cert jego odcisk palca, ponieważ musi skonfigurować Remote Desktop/SSL itp
  3. cert To nie jest jeszcze dodany do hostowane usługi certs.

W tym przypadku błąd 400 Bad Request naprawdę informacją, że masz zły wniosek, ponieważ certyfikat w CSCFG nie jest jeszcze podłączona do usługi hostingowej. Zamęt powstaje (dla mnie), ponieważ, ponieważ jest to certyfikat uniwersalny, błędnie interpretujesz komunikat o błędzie jako odnoszący się do uwierzytelnienia żądania, nawet jeśli nie otrzymujesz 401.