Fehlerbehebung bei der Signierung der Signature Version 4 für AWS-API-Anfragen - AWS Identity and Access Management

Fehlerbehebung bei der Signierung der Signature Version 4 für AWS-API-Anfragen

Wichtig

Sofern Sie nicht die AWS-SDKs oder die CLI verwenden, müssen Sie Code schreiben, um Signaturen zu berechnen, die Authentifizierungsinformationen in Ihren Anfragen bereitstellen. Die Berechnung der SigV4-Signatur kann ein komplexes Unterfangen sein, und wir empfehlen Ihnen, wann immer möglich die AWS-SDKs oder die CLI zu verwenden.

Wenn Sie Code entwickeln, der eine signierte Anfrage erstellt, erhalten Sie möglicherweise HTTP 403 SignatureDoesNotMatch von den AWS-Services. Diese Fehler bedeuten, dass der Signaturwert in Ihrer HTTP-Anfrage an AWS nicht mit der von AWS-Service berechneten Signatur übereinstimmt. HTTP Unauthorized 401-Fehler werden zurückgegeben, wenn die Berechtigungen es dem Aufrufer nicht erlauben, die Anfrage zu stellen.

API-Anforderungen können in folgenden Fällen einen Fehler zurückgeben:

  • Die API-Anforderung ist nicht signiert und die API-Anfrage verwendet die IAM-Authentifizierung.

  • Die zum Signieren der Anfrage verwendeten IAM-Anmeldeinformationen sind falsch oder verfügen nicht über die erforderlichen Berechtigungen zum Aufrufen der API.

  • Die Signatur der signierten API-Anfrage stimmt nicht mit der Signatur überein, die der AWS-Service berechnet hat.

  • Der API-Anforderungs-Header ist falsch.

Anmerkung

Aktualisieren Sie Ihr Signaturprotokoll von AWS-Signature Version 2 (SigV2) auf AWS-Signature Version 4 (Sigv4), bevor Sie nach anderen Fehlerlösungen suchen. Services wie Amazon S3 und Regionen unterstützen die SigV2-Signierung nicht mehr.

Fehler bei den Anmeldeinformationen

Stellen Sie sicher, dass die API-Anfrage mit SigV4 signiert ist. Wenn die API-Anfrage nicht signiert ist, erhalten Sie möglicherweise den folgenden Fehler: Missing Authentication Token. Fügen Sie die fehlende Signatur hinzu und senden Sie die Anfrage erneut.

Stellen Sie sicher, dass die Authentifizierungsdaten für den Zugriffsschlüssel und den geheimen Schlüssel korrekt sind. Wenn der Zugriffsschlüssel falsch ist, erhalten Sie möglicherweise die folgende Fehlermeldung: Unauthorized. Stellen Sie sicher, dass die zum Signieren der Anfrage verwendete Entität berechtigt ist, die Anfrage zu stellen. Details hierzu finden Sie unter Beheben von Fehlermeldungen bei verweigertem Zugriff.

Fehler bei der kanonischen Anfrage und beim Signieren der Zeichenfolge

Wenn Sie die kanonische Anfrage in Hash der kanonischen Anfrage erstellen oder Erstellen einer zu signierenden Zeichenfolge falsch berechnet haben, schlägt der vom Service durchgeführte Signaturüberprüfungsschritt mit der Fehlermeldung fehl:

The request signature we calculated does not match the signature you provided

Wenn der AWS-Service eine signierte Anfrage empfängt, berechnet er die Signatur neu. Wenn die Werte unterschiedlich sind, stimmen die Signaturen nicht überein. Vergleichen Sie die kanonische Anfrage und die Zeichenfolge mit Ihrer signierten Anfrage mit dem Wert in der Fehlermeldung. Ändern Sie den Signaturprozess, falls es Unterschiede gibt.

Anmerkung

Sie können auch überprüfen, ob Sie die Anfrage nicht über einen Proxy gesendet haben, der die Header oder die Anfrage ändert.

Beispiel für kanonische Anforderung
GET -------- HTTP method / -------- Path. For API stage endpoint, it should be /{stage-name}/{resource-path} -------- Query string key-value pair. Leave it blank if the request doesn't have a query string. content-type:application/json -------- Header key-value pair. One header per line. host:0123456789.execute-api.us-east-1.amazonaws.com -------- Host and x-amz-date are required headers for all signed requests. x-amz-date:20220806T024003Z content-type;host;x-amz-date -------- A list of signed headers d167e99c53f15b0c105101d468ae35a3dc9187839ca081095e340f3649a04501 -------- Hash of the payload

Um zu überprüfen, ob der Geheimschlüssel mit der Zugriffsschlüssel-ID übereinstimmt, können Sie ihn mit einer bekannten funktionierenden Implementierung testen. Verwenden Sie beispielsweise ein AWS-SDK oder die AWS-CLI um eine Anfrage an AWS zu stellen.

Header der API-Anfrage

Wenn der Autorisierungsheader leer ist, der Anmeldeinformationsschlüssel oder die Signatur fehlt oder falsch ist, der Header nicht mit einem Algorithmusnamen beginnt oder die Schlüssel-Wert-Paare kein Gleichheitszeichen enthalten, wird einer der folgenden Fehler angezeigt:

  • Der Autorisierungs-Header darf nicht leer sein.

  • Der Autorisierungs-Header erfordert den Parameter „Credential“.

  • Der Autorisierungs-Header erfordert den Parameter „Signatur“.

  • Die Signatur enthält ein ungültiges Schlüssel-Wert-Paar (fehlendes Gleichheitszeichen) im Autorisierungs-Header.

Stellen Sie sicher, dass der SigV4-Autorisierungsheader, den Sie in Berechnen der Signatur hinzugefügt haben, den richtigen Anmeldeinformationsschlüssel sowie das Anforderungsdatum enthält, entweder mithilfe des HTTP-Datums oder des x-amz-date-Headers.

Wenn Sie eine Fehlermeldung „IncompleteSignatureException“ erhalten haben und die Signatur korrekt aufgebaut ist, können Sie überprüfen, ob der Autorisierungs-Header während der Übertragung an den AWS-Service geändert wurde, indem Sie einen SHA-256-Hash und eine B64-Codierung des Autorisierungs-Headers in Ihrer clientseitigen Anfrage berechnen.

  1. Rufen Sie den Autorisierungs-Header ab, den Sie in der Anfrage gesendet haben. Ihr Autorisierungs-Header sieht ähnlich wie das folgende Beispiel aus:

    Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;range;x-amz-date, Signature=example-generated-signature
  2. Berechnen Sie einen SHA-256-Hash des Autorisierungs-Headers.

    hashSHA256(rawAuthorizationHeader) = hashedAuthorizationHeader
  3. Codieren Sie den gehashten Autorisierungs-Header in das Base64-Format.

    base64(hashedAuthorizationHeader) = encodedHashedAuthorizationHeader
  4. Vergleichen Sie die gehashte und codierte Zeichenfolge, die Sie gerade berechnet haben, mit der Zeichenfolge, die Sie in Ihrer Fehlermeldung erhalten haben. Ihre Fehlermeldung sollte dem folgenden Beispiel ähneln:

    com.amazon.coral.service#IncompleteSignatureException: The signature contains an in-valid key=value pair (missing equal-sign) in Authorization header (hashed with SHA-256 and encoded with Base64): '9c574f83b4b950926da4a99c2b43418b3db8d97d571b5e18dd0e4f3c3ed1ed2c'.
  • Wenn sich die beiden Hashes unterscheiden, hat sich ein Teil des Autorisierungs-Headers während der Übertragung geändert. Diese Änderung kann darauf zurückzuführen sein, dass Ihr Netzwerk oder Ihre Client-Handler signierte Header anfügen oder den Autorisierungs-Header auf irgendeine Weise ändern.

  • Wenn die beiden Hashes übereinstimmen, stimmt der von Ihnen in der Anfrage gesendete Autorisierungs-Header mit dem überein, den AWS erhalten hat. Überprüfen Sie die erhaltene Fehlermeldung, um festzustellen, ob das Problem auf falsche Anmeldeinformationen oder eine falsche Signatur zurückzuführen ist. Diese Fehler werden in den anderen Abschnitten auf dieser Seite behandelt.

Fehler im Geltungsbereich der Anmeldeinformationen

Der in Erstellen einer zu signierenden Zeichenfolge erstellte Anmeldeinformationsbereich beschränkt eine Signatur auf ein bestimmtes Datum, eine bestimmte Region und einen bestimmten Service. Die Zeichenfolge hat das folgende Format:

YYYYMMDD/region/service/aws4_request
Anmerkung

Wenn Sie SigV4a verwenden, ist die Region nicht im Gültigkeitsbereich der Anmeldeinformationen enthalten.

Datum

Wenn der Geltungsbereich der Anmeldeinformationen nicht dasselbe Datum wie der x-amz-date-Header angibt, schlägt der Schritt zur Signaturüberprüfung mit der folgenden Fehlermeldung fehl:

Date in Credential scope does not match YYYYMMDD from ISO-8601 version of date from HTTP

Wenn die Anforderung einen Zeitpunkt in der Zukunft angibt, schlägt der Schritt zur Signaturüberprüfung mit der folgenden Fehlermeldung fehl:

Signature not yet current: date is still later than date

Wenn die Anfrage abgelaufen ist, schlägt der Schritt zur Signaturüberprüfung mit der folgenden Fehlermeldung fehl:

Signature expired: date is now earlier than date
Region

Wenn der Geltungsbereich der Anmeldeinformationen nicht dieselbe Region wie die Anfrage angibt, schlägt der Schritt zur Signaturüberprüfung mit der folgenden Fehlermeldung fehl:

Credential should be scoped to a valid Region, not region-code
Service

Wenn der Geltungsbereich der Anmeldeinformationen nicht denselben Service wie der host-Header angibt, schlägt der Schritt zur Signaturüberprüfung mit der folgenden Fehlermeldung fehl:

Credential should be scoped to correct service: 'service'
Abschlusszeichenfolge

Wenn der Geltungsbereich der Anmeldeinformationen nicht mit aws4_request endet, schlägt der Schritt zur Signaturüberprüfung mit der folgenden Fehlermeldung fehl:

Credential should be scoped with a valid terminator: 'aws4_request'

Fehler bei der Schlüsselsignierung

Fehler, die durch falsche Ableitung des Signaturschlüssels oder unsachgemäße Verwendung von Kryptografie verursacht werden, sind schwieriger zu beheben. Nachdem Sie überprüft haben, ob die kanonische Zeichenfolge und die zu signierende Zeichenfolge korrekt sind, können Sie auch überprüfen, ob eines der folgenden Probleme vorliegt:

  • Der geheime Zugriffsschlüssel stimmt nicht mit der Zugriffsschlüssel-ID überein, die Sie angegeben haben.

  • Es liegt ein Problem mit dem Code zur Schlüsselableitung vor.

Um zu überprüfen, ob der Geheimschlüssel mit der Zugriffsschlüssel-ID übereinstimmt, können Sie ihn mit einer bekannten funktionierenden Implementierung testen. Verwenden Sie beispielsweise AWS SDK oder die AWS CLI um eine Anfrage an AWS zu stellen. Beispiele finden Sie unter Anfordern von Signaturbeispielen