AWS S3 - Wie kann der Fehler "Die von uns berechnete Anforderungssignatur stimmt nicht mit der Signatur überein" behoben werden?

90

Ich habe jetzt über zwei Tage im Internet gesucht und wahrscheinlich die meisten online dokumentierten Szenarien und Problemumgehungen durchgesehen, aber bisher hat nichts für mich funktioniert.

Ich bin auf AWS SDK für PHP V2.8.7 unter PHP 5.3.

Ich versuche, mit dem folgenden Code eine Verbindung zu meinem S3-Bucket herzustellen:

// Create a `Aws` object using a configuration file

        $aws = Aws::factory('config.php');

        // Get the client from the service locator by namespace
        $s3Client = $aws->get('s3');

        $bucket = "xxx";
        $keyname = "xxx";

        try {
            $result = $s3Client->putObject(array(
                'Bucket'        =>      $bucket,
                'Key'           =>      $keyname,
                'Body'          =>      'Hello World!'
            ));
            $file_error = false;
        } catch (Exception $e) {
            $file_error = true;
            echo $e->getMessage();
            die();
        }
        //  

Meine config.php-Datei lautet wie folgt:

<?php

return array(
    // Bootstrap the configuration file with AWS specific features
    'includes' => array('_aws'),
    'services' => array(
        // All AWS clients extend from 'default_settings'. Here we are
        // overriding 'default_settings' with our default credentials and
        // providing a default region setting.
        'default_settings' => array(
            'params' => array(
                'credentials' => array(
                    'key'    => 'key',
                    'secret' => 'secret'
                )
            )
        )
    )
);

Es wird der folgende Fehler ausgegeben:

Die von uns berechnete Anforderungssignatur stimmt nicht mit der von Ihnen angegebenen Signatur überein. Überprüfen Sie Ihren Schlüssel und Ihre Signaturmethode.

Ich habe meinen Zugangsschlüssel und mein Geheimnis bereits mindestens 20 Mal überprüft, neue generiert, verschiedene Methoden zur Übergabe der Informationen verwendet (z. B. Profil und Einfügen von Anmeldeinformationen in den Code), aber im Moment funktioniert nichts.

Joseph Lam
quelle
3
Das AWS SDK implementiert also nur eine Reihe direkter API-Aufrufe. Mit AWS verwendet jeder einzelne Anruf Ihren privaten Schlüssel (oder secrethöher) und berechnet daraus eine Signatur basierend auf Ihrem Zugriffsschlüssel, dem aktuellen Zeitstempel und einer Reihe anderer Faktoren. Siehe docs.aws.amazon.com/general/latest/gr/… . Es ist ein Longshot, aber da sie den Zeitstempel enthalten, ist die Zeit Ihrer lokalen Umgebung möglicherweise abgelaufen?
Josh Padnick
Dies geschah, als wir Content-Lengthin Objektmetadaten eine falsche Größe ( ) übergeben hatten. (Lange Version: Wir haben den Eingabestream direkt von einem Java HttpServletRequestan den S3-Client übergeben und request.getContentLength()wie Content-Lengthüber Metadaten übergeben. Als das Servlet (zufällig) Chunked Requests ( Transfer-Encoding: chunked) empfing , getContentLength()kehrte es zurück -1- was putObjectzu einem Fehlschlag (zufällig) führte. Dunkel, aber eindeutig unsere Schuld, weil wir eine falsche Objektgröße überschritten haben.)
Janaka Bandara
Josh, mein Laptop hatte eine Stunde frei (aus irgendeinem Grund war er auf Moskau und nicht auf London eingestellt). Danke für die Hilfe!
Ross Symonds

Antworten:

79

Nach zwei Tagen Debugging entdeckte ich endlich das Problem ...

Der Schlüssel, den ich dem Objekt zugewiesen habe, begann mit einem Punkt, d. H. ..\images\ABC.jpg der Fehler trat auf.

Ich wünschte, die API bietet eine aussagekräftigere und relevantere Fehlermeldung, leider hoffe ich, dass dies jemand anderem da draußen hilft!

Joseph Lam
quelle
Ich hatte den Status-Bucket und den Schlüssel rückwärts und dies ist der Fehler, den Sie erhalten (Signatur stimmt nicht überein). Wtf Terraform?
Lo-Tan
14
Ein führender Schrägstrich verursachte dieses Problem auch für mich. Sie brauchen nur Pfad / zu / Datei, nicht / Pfad / zu / Datei
Graham
3
Und für mich war das Problem Leerzeichen innerhalb des Schlüssels
Adam Szmyd
3
Um dies hinzuzufügen, wurde diese Fehlermeldung angezeigt, wenn +mein Schlüssel mit einem Pluszeichen versehen war .
LCC
1
Ich habe dies erhalten, als ich den Content-TypeHeader in meiner Upload-Dateianforderung nicht angegeben habe
Angel Venchev
34

Ich erhalte diesen Fehler mit den falschen Anmeldeinformationen. Ich denke, es gab unsichtbare Zeichen, als ich es ursprünglich einfügte.

Alex Levine
quelle
3
Ich habe einfach auf Doppelklick geklickt key_hash_lala/key_hash_continuesund es wurde nur ein Teil ausgewählt. Ach, wie schwer ist es, dem Benutzer "falsches Passwort, Alter!" Zu sagen?
Ufos
Das erste Mal hatte ich Probleme beim Kopieren des Schlüssels von der herunterladbaren CSV. Für den zweiten Schlüssel, den ich erstellt habe, habe ich ihn einfach aus dem Browser kopiert und hatte keine Probleme
nthaxis
+1 nach @nthaxis - Kopieren aus der CSV verursachte einen Fehler - Kopieren direkt aus dem Browser und es funktioniert ein Vergnügen
NKCampbell
13

Ich hatte das gleiche Problem, als ich versuchte, ein Objekt mit einigen UTF8-Zeichen zu kopieren. Unten ist ein JS-Beispiel:

var s3 = new AWS.S3();

s3.copyObject({
    Bucket: 'somebucket',
    CopySource: 'path/to/Weird_file_name_ðÓpíu.jpg',
    Key: 'destination/key.jpg',
    ACL: 'authenticated-read'
}, cb);

Gelöst durch Codierung der CopySource mit encodeURIComponent()

Entwickler
quelle
9

Dieser Fehler scheint meistens aufzutreten, wenn vor oder nach Ihrem geheimen Schlüssel ein Leerzeichen steht

Harrish Selvarajah
quelle
Das ist Hilfe voll
Mr S Coder
Hatte das gleiche Problem. Skype kopiert manchmal Werte mit Leerzeilen. Fügen Sie es einfach in den Editor ein und kopieren Sie es dann ohne Leerzeichen.
michal-michalak
Ja ! Überprüfen Sie auch, ob in anderen Kopfzeilen Leerzeichen vorhanden sind.
Eino Gourdin
6

Tatsächlich wurde in Java der gleiche Fehler angezeigt. Nachdem ich 4 Stunden mit dem Debuggen verbracht hatte, stellte ich fest, dass das Problem in Metadaten in S3-Objekten lag, da beim Sitzen von Cache-Steuerelementen in S3-Dateien Speicherplatz vorhanden war. Dieser Speicherplatz war in 1.6 zulässig. * Version, aber in 1.11. * ist es nicht erlaubt und hat daher den Signatur-Mismatch-Fehler ausgelöst

Sarir
quelle
Kommt auch vor, wenn Sie eine falsche Content-Lengthin den Metadaten übergeben
Janaka Bandara
3

Wenn keine der anderen genannten Lösungen für Sie funktioniert, versuchen Sie es mit

aws configure

dieser Befehl öffnet eine Reihe von Optionen, in denen nach Schlüsseln, Region und Ausgabeformat gefragt wird.

Hoffe das hilft!

Saurabh
quelle
3

Für mich habe ich Axios verwendet und durch Deafult sendet es Header

content-type: application/x-www-form-urlencoded

Also ändere ich um zu senden:

content-type: application/octet-stream

und musste diesen Inhaltstyp auch zur AWS-Signatur hinzufügen

const params = {
    Bucket: bucket,
    Key: key,
    Expires: expires,
    ContentType = 'application/octet-stream'
}

const s3 = new AWS.S3()
s3.getSignedUrl('putObject', params)
Dawid K.
quelle
3

In einer früheren Version von aws-php-sdk S3Client::factory()durften Sie vor der Ablehnung der Methode einen Teil des Dateipfads oder, Keywie er in den S3Client->putObject()Parametern genannt wird , auf den Bucket-Parameter setzen. Ich hatte einen Dateimanager in der Produktion, der das v2 SDK verwendete. Da die Factory-Methode immer noch funktionierte, habe ich dieses Modul nach dem Update auf nicht erneut besucht ~3.70.0. Heute habe ich den größten Teil von zwei Stunden damit verbracht, zu debuggen, warum ich diesen Fehler erhalten habe, und dies war letztendlich auf die Parameter zurückzuführen, die ich übergeben habe (die früher funktionierten):

$s3Client = new S3Client([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2006-03-01'
]);
$result = $s3Client->putObject([
    'Bucket' => 'awesomecatpictures/catsinhats',
    'Key' => 'whitecats/white_cat_in_hat1.png',
    'SourceFile' => '/tmp/asdf1234'
]);

Ich musste den catsinhatsTeil meines Bucket / Key-Pfads Keywie folgt auf den Parameter verschieben:

$s3Client = new S3Client([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2006-03-01'
]);
$result = $s3Client->putObject([
    'Bucket' => 'awesomecatpictures',
    'Key' => 'catsinhats/whitecats/white_cat_in_hat1.png',
    'SourceFile' => '/tmp/asdf1234'
]);

Was ich glaube passiert ist, dass die Bucket Name jetzt URL-codiert wird. Nach weiterer Überprüfung der genauen Nachricht, die ich vom SDK erhalten habe, stellte ich Folgendes fest:

Fehler beim Ausführen PutObjectamhttps://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.png

AWS HTTP-Fehler: Client-Fehler: PUT https://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.pngführte zu a403 Forbidden

Dies zeigt, dass das, was /ich meinem BucketParameter zur Verfügung gestellt habe, durchgegangen ist urlencode()und jetzt ist %2F.

Die Funktionsweise der Signatur ist ziemlich kompliziert, aber das Problem läuft darauf hinaus, dass der Bucket und der Schlüssel zum Generieren der verschlüsselten Signatur verwendet werden. Wenn sie sowohl auf dem aufrufenden Client als auch in AWS nicht genau übereinstimmen, wird die Anforderung mit einem 403 abgelehnt. Die Fehlermeldung weist tatsächlich auf das Problem hin:

Die von uns berechnete Anforderungssignatur stimmt nicht mit der von Ihnen angegebenen Signatur überein. Überprüfen Sie Ihren Schlüssel und Ihre Signaturmethode.

Also war mein Keyfalsch, weil mein Bucketfalsch war.

Aaron St. Clair
quelle
3

Ich hatte den gleichen Fehler in nodejs. Aber das Hinzufügen signatureVersiondes s3-Konstruktors hat mir geholfen:

const s3 = new AWS.S3({
  apiVersion: '2006-03-01',
  signatureVersion: 'v4',
});
Oleg
quelle
Versuchte viele Dinge, bevor ich darauf stieß! Das war die Antwort für mich.
DavidG
2

Ich habe gerade das Hochladen eines Bildes auf S3 mit dem AWS SDK mit React Native erlebt. Es stellte sich heraus, dass dies durch den ContentEncodingParameter verursacht wurde .

Durch Entfernen dieses Parameters wurde das Problem "behoben".

John Veldboom
quelle
2

Ich hatte das gleiche Problem. Ich hatte die Standardmethode PUT festgelegt, um die vorsignierte URL zu definieren, versuchte jedoch, ein GET durchzuführen. Der Fehler war auf eine Nichtübereinstimmung der Methode zurückzuführen.

Maheeka
quelle
Das hat bei mir funktioniert. Das HTTP-Verb (PUT, POST), das zum Generieren der signierten URL verwendet wird, muss mit dem Verb übereinstimmen, das beim Hochladen mit dieser URL verwendet wird.
Craigcaulfield
2

In meinem Fall habe ich verwendet, s3.getSignedUrl('getObject')als ich verwenden musste s3.getSignedUrl('putObject')(weil ich einen PUT zum Hochladen meiner Datei verwende), weshalb die Signaturen nicht übereinstimmten.

Elon Zito
quelle
Hat mich nach langen Stunden gerettet. Vielen Dank!!
Kisinga
1

Ich hatte einen ähnlichen Fehler, aber für mich schien dies darauf zurückzuführen zu sein, dass ein IAM-Benutzer erneut verwendet wurde, um mit S3 in zwei verschiedenen Elastic Beanstalk-Umgebungen zu arbeiten. Ich habe das Symptom behandelt, indem ich für jede Umgebung einen IAM-Benutzer mit identischen Berechtigungen erstellt habe, wodurch der Fehler behoben wurde.

Joseph Combs
quelle
1

In meinem Fall habe ich eine S3-URL in ihre Komponenten analysiert.

Zum Beispiel:

Url:    s3://bucket-name/path/to/file

Wurde analysiert in:

Bucket: bucket-name
Path:   /path/to/file

Wenn der Pfadteil ein führendes '/' enthält, ist die Anforderung fehlgeschlagen.

AVIDeveloper
quelle
1

Ein weiteres mögliches Problem könnte sein, dass die Metawerte keine US-ASCII-Zeichen enthalten. Für mich hat es geholfen, die Werte beim Hinzufügen zu putRequest mit UrlEncode zu versehen:

request.Metadata.Add(AmzMetaPrefix + "artist", HttpUtility.UrlEncode(song.Artist));
request.Metadata.Add(AmzMetaPrefix + "title", HttpUtility.UrlEncode(song.Title));
Sebastian
quelle
1

Ich habe dieses Problem behoben, indem ich die öffentlichen Berechtigungen für meinen AWS s3-Bucket geändert und die CORS-Konfiguration unten zu meinen Bucket-Einstellungen hinzugefügt habe.

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration>
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

Weitere Informationen finden Sie in der AWS s3-Dokumentation .

LobsterBaz
quelle
1

Meistens geschieht dies aufgrund des falschen Schlüssels (AWS_SECRET_ACCESS_KEY). Bitte überprüfen Sie Ihren AWS_SECRET_ACCESS_KEY. Hoffe es wird funktionieren ...

Amol Kakade
quelle
1

Ich habe diesen Fehler beim Versuch, ein Objekt zu kopieren, erhalten. Ich habe es durch Codierung der copySource behoben. Dies ist tatsächlich in der Methodendokumentation beschrieben:

Parameter: copySource - Der Name des Quell-Buckets und der Schlüsselname des Quellobjekts, getrennt durch einen Schrägstrich (/). Muss URL-codiert sein.

CopyObjectRequest objectRequest = CopyObjectRequest.builder()
                .copySource(URLEncoder.encode(bucket + "/" + oldFileKey, "UTF-8"))
                .destinationBucket(bucket)
                .destinationKey(newFileKey)
                .build();
Diego Keller
quelle
1

In meinem Fall habe ich S3 (Großbuchstaben) als Dienstnamen verwendet, als ich eine Anfrage mit dem Postboten in der AWS-Signaturautorisierungsmethode gestellt habe

Judasane
quelle
Können Sie bitte weitere Details hinzufügen, wo AWS Sign geschaltet werden soll?
Mr S Coder
1

Nach dem Debuggen und viel Zeitaufwand bestand in meinem Fall das Problem mit der access_key_id und der secret_access_key. Überprüfen Sie einfach Ihre Anmeldeinformationen oder generieren Sie nach Möglichkeit neue, und stellen Sie sicher, dass Sie die Anmeldeinformationen in params übergeben.

jazeb007
quelle
Als ich die obige Antwort las, überprüfte ich meinen geheimen Schlüssel noch einmal und stellte fest, dass ich / am Ende hinzugefügt habe.
Ezrqn Kemboi
1

Für Python-Set - Signature_Version S33

s3 = boto3.client(
   's3',
   aws_access_key_id='AKIAIO5FODNN7EXAMPLE',
   aws_secret_access_key='ABCDEF+c2L7yXeGvUyrPgYsDnWRRC1AYEXAMPLE',
   config=Config(signature_version='s3v4')
)
Saurav Sarkar
quelle
Tatsächlich. Weitere Informationen hier: aws.amazon.com/premiumsupport/knowledge-center/…
Davy
0

In meinem Fall war der Bucket-Name falsch, er enthielt den ersten Teil des Schlüssels (Bucketxxx / Keyxxx) - an der Signatur war nichts falsch.

Martin Flower
quelle
0

In meinem Fall (Python) ist dies fehlgeschlagen, weil ich diese beiden Codezeilen in der Datei hatte, die von einem älteren Code geerbt wurden

http.client.HTTPConnection._http_vsn = 10 http.client.HTTPConnection._http_vsn_str = 'HTTP/1.0'

Nir Soudry
quelle
0

Ich habe dies in einem Docker-Image mit einem Nicht-AWS S3-Endpunkt festgestellt, als ich das neueste verwendet habe awscli festgestellt Version von Debian Stretch verwendet habe, dh Version 1.11.13.

Ein Upgrade auf CLI Version 1.16.84 hat das Problem behoben.

So installieren Sie die neueste Version der CLI mit einer Docker-Datei, die auf einem Debian-Stretch-Image basiert, anstatt:

RUN apt-get update
RUN apt-get install -y awscli
RUN aws --version

Verwenden:

RUN apt-get update
RUN apt-get install -y python-pip
RUN pip install awscli
RUN aws --version
RWD
quelle
0

Ich musste setzen

Aws.config.update({
  credentials: Aws::Credentials.new(access_key_id, secret_access_key)
})

vorher mit dem ruby ​​aws sdk v2 (wahrscheinlich gibt es auch in den anderen sprachen etwas ähnliches)

Yo Ludke
quelle
0

Ich weiß nicht, ob jemand auf dieses Problem gestoßen ist, als er versucht hat, die ausgegebene URL im Browser zu testen, aber ob Sie Postmandie generierte URL von AWS verwenden und versuchen, sie aus dem zu kopierenRAW Registerkarte , wird der obige Fehler , da Backslashes vermieden werden .

Verwenden Sie die Pretty Registerkarte, um die URL zu kopieren und einzufügen, um festzustellen, ob sie tatsächlich funktioniert.

Ich bin kürzlich auf dieses Problem gestoßen und diese Lösung hat mein Problem gelöst. Zu Testzwecken können Sie feststellen, ob Sie die Daten tatsächlich über die URL abrufen.

Diese Antwort bezieht sich auf diejenigen, die versuchen, einen Download, einen temporären Link von AWS oder generell eine URL von AWS zur Verwendung zu generieren.

pr1nc3
quelle
0

Das Problem in meinem Fall war die API-Gateway-URL, die zum Konfigurieren von Amplify verwendet wurde und am Ende einen zusätzlichen Schrägstrich aufwies ...

Die abgefragte URL sah aus wie https://....amazonaws.com/myapi//myendpoint. Ich habe den zusätzlichen Schrägstrich in der Conf entfernt und es hat funktioniert.

Nicht die expliziteste Fehlermeldung meines Lebens.

7hibault
quelle
0

In meinem Fall habe ich angerufen s3request.promise().then() inkorrekt was dazu führte, dass zwei Ausführungen der Anforderung ausgeführt wurden, wenn nur ein Aufruf ausgeführt wurde.

Was ich damit meine ist, dass ich 6 Objekte durchlaufen habe, aber 12 Anfragen gestellt wurden (Sie können dies überprüfen, indem Sie sich in der Konsole anmelden oder das Netzwerk im Browser debuggen).

Da der Zeitstempel für die zweite, unerwünschte Anfrage nicht mit der Signatur der ersten übereinstimmte, führte dies zu diesem Problem.

Mauricio Gracia Gutierrez
quelle
0

Beim Hochladen des Dokuments in CloudSearch über das Java SDK ist dieser Fehler aufgetreten. Das Problem war auf ein Sonderzeichen im hochzuladenden Dokument zurückzuführen. Der Fehler "Die von uns berechnete Anforderungssignatur stimmt nicht mit der von Ihnen angegebenen Signatur überein. Überprüfen Sie Ihren geheimen AWS-Zugriffsschlüssel und die Signaturmethode." ist sehr irreführend.

Dibs
quelle
0

Das Generieren eines neuen Zugriffsschlüssels hat bei mir funktioniert.

yungBolo
quelle