2016-10-29 3 views
2

Ich baue gerade einen Webservice, der Alexa Voice Intents verarbeiten soll. Die HTTP-Anfrage, die ich von Alexa bekomme, muss durch Überprüfung einer Signatur verifiziert werden, wie in der documentation beschrieben (siehe unten für einen Auszug).Verifizieren der Signatur einer Alexa-Anfrage

Ich scheine die in der Anfrage gesendete Signatur korrekt zu entschlüsseln und scheint die Signatur des Anfragekörpers korrekt zu berechnen. Aber sie unterscheiden sich - aber anstatt völlig verschieden zu sein (was auf einen Fehler in der Berechnung hinweisen würde), ist die berechnete Signatur ein Suffix der gesendeten Signatur. Zum Beispiel:

empfangene Signatur (decodierten und entschlüsselten):

3021300906052b0e03021a05000414ca5cc3be233b045be79e94389e47353b7aaec434

Berechnete Unterschrift des Anforderungs Körpers (seine SHA1-Hash):

ca5cc3be233b045be79e94389e47353b7aaec434

Was die zusätzlichen Bytes am Anfang der empfangenen Signatur? Sie scheinen sich zwischen den Anfragen nicht zu ändern.

Verschiedene Informationen:

  • Die aktuelle (2016-10-29) certificate chain file
  • Ursprüngliche empfangene Signatur für das obige Beispiel Unterschrift: M4Xq8WmUHjaR4Fgj9HUheoOUkZf4tkc5koBtkBq/nCmh4X6EiimBXWa7p+kHoMx9noTdytGSUREaxYofTne1CzYOW0wxb9x6Jhor6lMwHAr4cY+aR1AEOkWrjsP94bewRr1/CxYNl7kGcj4+QjbEa/7dL19BNmLiufMLZDdRFsZSzlfXpPaAspsoStqVc/qc26tj5R9wtB0sTS4wbFc4eyCPFaCZocq1gmjfR3YQXupuD7J3slrz54SxukNmL/M1CIoZ8lOXjS82XLkKjsrzXdY5ePk8XsEDjNWkFSLbqzBzGBqzWx4M913uDA6gPx5tFKeoP8FgpV+BHKDf3d4gmQ==

die Unterschrift des Antrags prüfen

Anfragen von Alexa Informationen, die Sie die Signatur in den HTTP-Header überprüfen müssen liefern gesendet:

  • SignatureCertChainUrl
  • Signature

Um die Signatur zu validieren:

  • Überprüfen Sie die vom SignatureCertChainUrl-Header angegebene URL für die Anforderung, um sicherzustellen, dass sie dem von Amazon verwendeten Format entspricht. Siehe Überprüfen der Signaturzertifikat-URL.

  • Laden Sie die PEM-codierte X.509-Zertifikatskette herunter, die Alexa zum Signieren der Nachricht verwendet hat, wie vom SignatureCertChainUrl-Headerwert für die Anforderung angegeben.

  • Diese Kette wird zur Laufzeit bereitgestellt, sodass das Zertifikat regelmäßig aktualisiert werden kann. Daher sollte Ihr Webdienst für verschiedene URLs mit unterschiedlichem Inhalt resilient sein.

  • Diese Zertifikatskette besteht in der Reihenfolge (1) aus dem Amazon-Signaturzertifikat und (2) einem oder mehreren zusätzlichen Zertifikaten, die eine Vertrauenskette zu einem Stammzertifikatszertifikat (CA-Zertifikat) erstellen.Um die Gültigkeit des Signaturzertifikats zu bestätigen, führen Sie die folgenden Prüfungen durch:
    • Das Signaturzertifikat nicht abgelaufen ist (prüfen sowohl die nicht vor und nicht nach dates)
    • Der Domain echo-api.amazon.com vorhanden ist in dem Subject Alternative Names (SANs) Abschnitt des Signaturzertifikats
    • Alle Zertifikate in der Kette kombinieren, um eine Kette des Vertrauens zu einem vertrauenswürdigen root-CA-Zertifikat
  • erstellen Sobald Sie, dass das Signaturzertifikat gültig festgestellt haben, ist , extrahiere den öffentlichen Schlüssel daraus.
  • Base64-dekodieren Sie den Signature-Header-Wert der Anfrage, um die verschlüsselte Signatur zu erhalten.
  • Verwenden Sie den aus dem Signaturzertifikat extrahierten öffentlichen Schlüssel, um die verschlüsselte Signatur zu entschlüsseln, um den angegebenen Hashwert zu erstellen.
  • Generieren einen SHA-1-Hash-Wert aus dem vollständigen HTTPS-Anforderung Körper
  • Vergleich den geltend gemachten Hashwert und abgeleitete Hash-Werte den abgeleiteten Hash-Wert zu erzeugen, um sicherzustellen, dass sie von googeln für

Antwort