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==
- Auszug aus dem Alexa documentation:
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