wake-up-neo.com

Wie kann ich den Fehler beheben? Die von uns berechnete Anforderungssignatur stimmt nicht mit der Signatur überein.

Ich habe seit über zwei Tagen im Internet gesucht und habe wahrscheinlich die meisten online dokumentierten Szenarien und Problemumgehungen durchgesehen, aber bisher funktionierte nichts für mich.

Ich bin auf AWS SDK für PHP V2.8.7 unter PHP 5.3. Ich versuche, mich mit folgendem Code mit meinem S3-Bucket zu verbinden:

// 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 erzeugt:

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 bereits mindestens 20 Mal meinen Zugriffsschlüssel und sein Geheimnis überprüft, neue generiert und verschiedene Methoden verwendet, um die Informationen zu übergeben (d. H. Profil und das Einfügen von Berechtigungsnachweisen in Code).

25
Joseph Lam

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

Der Schlüssel, den ich dem Objekt zugewiesen hatte, begann mit einer Periode, d. H. ..\images\ABC.jpg. Dies führte dazu, dass der Fehler auftrat.

Ich wünschte, die API bietet eine aussagekräftigere und relevantere Fehlermeldung. Leider hoffe ich, dass dies jemandem da draußen helfen wird!

28
Joseph Lam

Ich erhalte diesen Fehler mit den falschen Anmeldeinformationen. Ich glaube, es gab unsichtbare Charaktere, als ich sie ursprünglich eingefügt habe.

14
Alex Levine

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 Kodieren der CopySource mit encodeURIComponent()

5
ecdeveloper

In einer früheren Version von aws-php-sdk durften Sie vor dem Verfall der Methode S3Client::factory() einen Teil des Dateipfads oder Key, wie er heißt, einfügen Die Parameter S3Client->putObject() im Bucket-Parameter. 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 ~3.70.0 Nicht mehr besucht. Heute habe ich den größten Teil von zwei Stunden damit verbracht, zu debuggen, warum ich angefangen habe, diesen Fehler zu erhalten. Das lag letztendlich an den Parametern, die ich übergeben habe (was früher funktionierte):

$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 Abschnitt catsinhats meines Bucket-/Schlüsselpfads wie folgt in den Parameter Key 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'
]);

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

Fehler beim Ausführen von PutObject auf https://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.png Führte zu einem 403 Forbidden

Dies zeigt, dass der /, Den ich für meinen Bucket -Parameter angegeben habe, urlencode() durchlaufen hat und jetzt %2F Lautet.

Die Funktionsweise der Signatur ist recht kompliziert, das Problem besteht jedoch darin, dass der Eimer und der Schlüssel zum Generieren der verschlüsselten Signatur verwendet werden. Stimmen sie sowohl auf dem aufrufenden Client als auch in AWS nicht genau überein, wird die Anforderung mit 403 abgelehnt. Die Fehlermeldung weist tatsächlich auf das Problem hin:

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

Also, mein Key war falsch, weil mein Bucket falsch war.

2
Aaron St. Clair

Eigentlich bekam ich in Java den gleichen Fehler. Nachdem ich 4 Stunden lang mit dem Debuggen gearbeitet hatte, stellte ich fest, dass das Problem in den Metadaten von S3-Objekten lag, da während des Sitzens von Cache-Steuerelementen in S3-Dateien Speicherplatz vorhanden war. Dieser Speicherplatz war in 1.6 zulässig. * Version aber in 1.11. * ist nicht zulässig und daher wurde der Fehler der Signaturfehlanpassung ausgelöst

2
sarir

Ich habe gerade erfahren, wie ein Bild mithilfe des AWS SDK mit React Native in S3 hochgeladen wurde. Es stellte sich heraus, dass dies durch den Parameter ContentEncoding verursacht wurde.

Durch das Entfernen dieses Parameters wurde das Problem "behoben".

2
John Veldboom

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!

1
monothorn

Ich hatte das gleiche Problem. Ich hatte die Standardmethode PUT eingestellt, um die vorsignierte URL zu definieren, aber ich habe versucht, ein GET durchzuführen. Der Fehler ist auf eine nicht übereinstimmende Methode zurückzuführen.

0
maheeka

Dies ist mir in einem Docker-Image mit einem Nicht-AWS S3-Endpunkt aufgefallen, wenn die neueste, für Debian Stretch verfügbare Version von awscli verwendet wurde, d. H. Version 1.11.13.

Durch ein Upgrade auf die CLI-Version 1.16.84 wurde das Problem behoben.

So installieren Sie die neueste Version der CLI mit einer Dockerfile, die auf einem Debian-Stretch-Image basiert, anstelle von:

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

Benutzen:

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

Ich weiß nicht, ob bei dem Versuch, die ausgegebene URL im Browser zu testen, jemand auf dieses Problem gestoßen ist, aber wenn Sie Postman verwenden und versuchen, die generierte URL von AWS von der Registerkarte RAW zu kopieren. Wegen des Entstehens von Backslashes wird der obige Fehler angezeigt.

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

Ich bin vor kurzem auf dieses Problem gestoßen, und diese Lösung hat mein Problem gelöst. Es dient zu Testzwecken, um festzustellen, 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 zu generieren.

0
pr1nc3

In meinem Fall (Python) ist es fehlgeschlagen, weil ich diese zwei 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'

0
Nir Soudry

Beim Hochladen eines Dokuments in CloudSearch über Java SDK. Das Problem wurde durch ein Sonderzeichen im hochzuladenden Dokument verursacht. Der Fehler "Die von uns berechnete Anforderungssignatur stimmt nicht mit Ihrer Signatur überein Überprüfen Sie Ihren geheimen AWS-Zugriffsschlüssel und die Signaturmethode. "ist sehr irreführend.

0
dibs

Ich musste einstellen 

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

vorher mit dem Ruby aws sdk v2 (wahrscheinlich ähnelt dies auch in den anderen Sprachen)

0
Yo Ludke

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

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.

0
AVIDeveloper

Ich hatte einen ähnlichen Fehler, aber für mich schien es 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 behandelte das Symptom, indem ich einen identisch berechtigten IAM-Benutzer für jede Umgebung erstellte und dadurch der Fehler beseitigt wurde.

0
Joseph Combs

Ich könnte dieses Problem durch das Setzen von Umgebungsvariablen lösen. 

export AWS_ACCESS_KEY=
export AWS_SECRET_ACCESS_KEY=

In IntelliJ + py.test setze ich Umgebungsvariablen mit [Run] > [Edit Configurations] > [Configuration] > [Environment] > [Environment variables]

0
MiaeKim

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.

0
7hibault

Für mich habe ich Axios verwendet und er sendet standardmäßig Header

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

also ändere ich um zu senden:

content-type: application/octet-stream

und musste diesen Inhaltstyp 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)
0
Dawid K.

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

0
Martin Flower

Ich hatte den gleichen Fehler in nodejs. Aber das Hinzufügen von signatureVersion im s3-Konstruktor hat mir geholfen:

const s3 = new AWS.S3({
  apiVersion: '2006-03-01',
  signatureVersion: 'v4',
});
0
Oleg

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

Ich meine, ich habe 6 Objekte durchlaufen, aber es wurden 12 Anforderungen gestellt (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, wurde dieses Problem verursacht.

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

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