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.
quelle
secret
hö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?Content-Length
in Objektmetadaten eine falsche Größe ( ) übergeben hatten. (Lange Version: Wir haben den Eingabestream direkt von einem JavaHttpServletRequest
an den S3-Client übergeben undrequest.getContentLength()
wieContent-Length
über Metadaten übergeben. Als das Servlet (zufällig) Chunked Requests (Transfer-Encoding: chunked
) empfing ,getContentLength()
kehrte es zurück-1
- wasputObject
zu einem Fehlschlag (zufällig) führte. Dunkel, aber eindeutig unsere Schuld, weil wir eine falsche Objektgröße überschritten haben.)Antworten:
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!
quelle
+
mein Schlüssel mit einem Pluszeichen versehen war .Content-Type
Header in meiner Upload-Dateianforderung nicht angegeben habeIch erhalte diesen Fehler mit den falschen Anmeldeinformationen. Ich denke, es gab unsichtbare Zeichen, als ich es ursprünglich einfügte.
quelle
key_hash_lala/key_hash_continues
und es wurde nur ein Teil ausgewählt. Ach, wie schwer ist es, dem Benutzer "falsches Passwort, Alter!" Zu sagen?Ich hatte das gleiche Problem, als ich versuchte, ein Objekt mit einigen UTF8-Zeichen zu kopieren. Unten ist ein JS-Beispiel:
Gelöst durch Codierung der CopySource mit
encodeURIComponent()
quelle
Dieser Fehler scheint meistens aufzutreten, wenn vor oder nach Ihrem geheimen Schlüssel ein Leerzeichen steht
quelle
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
quelle
Content-Length
in den Metadaten übergebenWenn keine der anderen genannten Lösungen für Sie funktioniert, versuchen Sie es mit
dieser Befehl öffnet eine Reihe von Optionen, in denen nach Schlüsseln, Region und Ausgabeformat gefragt wird.
Hoffe das hilft!
quelle
Für mich habe ich Axios verwendet und durch Deafult sendet es Header
Also ändere ich um zu senden:
und musste diesen Inhaltstyp auch zur AWS-Signatur hinzufügen
quelle
In einer früheren Version von aws-php-sdk
S3Client::factory()
durften Sie vor der Ablehnung der Methode einen Teil des Dateipfads oder,Key
wie er in denS3Client->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):Ich musste den
catsinhats
Teil meines Bucket / Key-PfadsKey
wie folgt auf den Parameter verschieben: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
PutObject
amhttps://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 a403 Forbidden
Dies zeigt, dass das, was
/
ich meinemBucket
Parameter zur Verfügung gestellt habe, durchgegangen isturlencode()
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:
Also war mein
Key
falsch, weil meinBucket
falsch war.quelle
Ich hatte den gleichen Fehler in nodejs. Aber das Hinzufügen
signatureVersion
des s3-Konstruktors hat mir geholfen:quelle
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
ContentEncoding
Parameter verursacht wurde .Durch Entfernen dieses Parameters wurde das Problem "behoben".
quelle
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.
quelle
In meinem Fall habe ich verwendet,
s3.getSignedUrl('getObject')
als ich verwenden musstes3.getSignedUrl('putObject')
(weil ich einen PUT zum Hochladen meiner Datei verwende), weshalb die Signaturen nicht übereinstimmten.quelle
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.
quelle
In meinem Fall habe ich eine S3-URL in ihre Komponenten analysiert.
Zum Beispiel:
Wurde analysiert in:
Wenn der Pfadteil ein führendes '/' enthält, ist die Anforderung fehlgeschlagen.
quelle
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));
quelle
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.
Weitere Informationen finden Sie in der AWS s3-Dokumentation .
quelle
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 ...
quelle
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:
quelle
In meinem Fall habe ich S3 (Großbuchstaben) als Dienstnamen verwendet, als ich eine Anfrage mit dem Postboten in der AWS-Signaturautorisierungsmethode gestellt habe
quelle
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.
quelle
Für Python-Set - Signature_Version S33
quelle
In meinem Fall war der Bucket-Name falsch, er enthielt den ersten Teil des Schlüssels (Bucketxxx / Keyxxx) - an der Signatur war nichts falsch.
quelle
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'
quelle
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:
Verwenden:
quelle
Ich musste setzen
vorher mit dem ruby aws sdk v2 (wahrscheinlich gibt es auch in den anderen sprachen etwas ähnliches)
quelle
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
Postman
die 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.
quelle
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.
quelle
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.
quelle
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.
quelle
Das Generieren eines neuen Zugriffsschlüssels hat bei mir funktioniert.
quelle