2012-04-23 46 views
7

Używam klasy PHP dla Amazon S3 i CloudFront - Link. Ale gdy próbuję załadować plik do pojemnika, pojawia się następujący błąd:SignatureDoesNotMatch - Amazon S3 API

[SignatureDoesNotMatch] The request signature we calculated does not match the signature you provided. Check your key and signing method.

Jak to naprawić?

Dzięki.

Odpowiedz

8

Po zarejestrowaniu się w usłudze Amazon można utworzyć parę kluczy (Amazon wywołuje te identyfikatory klucza dostępu i tajny klucz dostępu).

Te dwa są używane do podpisywania wniosków do serwisów internetowych Amazon. Amazon ponownie oblicza podpis i porównuje, jeśli jest zgodny z tym, który zawierał Twój wniosek. W ten sposób tajny klucz dostępu nigdy nie musi być przesyłany przez sieć.

Jeśli pojawi się komunikat "Podpis nie pasuje", najprawdopodobniej użyłeś niewłaściwego tajnego klucza dostępu. Czy możesz dwukrotnie sprawdzić klucz dostępu i tajny klucz dostępu, aby upewnić się, że są poprawne?

+0

Dzięki! Jak rozwiązać ten problem - http://goo.gl/QTdm4 –

+0

@ roman-nazarkin Więc problemem była lokalizacja kubełka? – awendt

+1

w moim przypadku było jakieś dodatkowe spacje w pliku/ustawieniu konfiguracyjnym, który miał tajny klucz, więc transmitował dodatkowy znak 'tab' w" haśle ", unieważniając tym samym podpis. – drzaus

4

Osobiście otrzymałem ten błąd z powodu znaków, które znajdowały się w moich metadanych.

Problematyczny był znak "-" oznaczający "\ u2013" w kodzie Unicode i różny od "-".

$result = $s3->putObject(array(
    'Bucket'  => $bucket, 
    'Key'   => $keyname, 
    'Metadata' => [ 
     'name' => 'Terminology – Blah' 
    ] 
)); 

Uwaga od dokumentacji http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html#UserMetadata ...

Amazon S3 stores user-defined metadata in lowercase. Each name, value pair must conform to US-ASCII when using REST and UTF-8 when using SOAP or browser-based uploads via POST.

+1

ditto - podczas dodawania metadanych z kluczem "Cache-Control" do obiektu, który ma już klucz metadanych "kontroli pamięci podręcznej", pojawia się ten błąd. – Joscha

0

miałem ten błąd z putObject() podczas określania Key zaczynające się od znaku ukośnika (/) - po usunięciu ukośnik to działało w porządku.