2017-12-07 123 views
8

Próbuję wygenerować ten sam podpis z http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html przy użyciu Pythona,sigv4 post-przykład przy użyciu Pythona

DateKey = hmac.new(b'AWS4wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY', b'20151229', hashlib.sha256).digest() 

DateRegionKey = hmac.new(DateKey, b'us-east-1', hashlib.sha256).digest() 

DateRegionServiceKey = hmac.new(DateRegionKey, b's3', hashlib.sha256).digest() 

SigningKey = hmac.new(DateRegionServiceKey, b'aws4_request', hashlib.sha256).digest() 

signature = hmac.new(other_policy, SigningKey, hashlib.sha256).hexdigest() 

Ale mój podpis jest cb0b0ec487fd5e01382c9c3b6b6a6dfa170da312ddab58a4b18869e7413951be i oczekuje podpis jest 46503978d3596de22955b4b18d6dfb1d54e8c5958727d5bdcd02cc1119c60fc9

Gdzie robię źle?

Uwaga

other_policy = b'''eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJzaWd2NGV4YW1wbGVidWNrZXQifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwNCiAgICB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRDb250ZW50LVR5cGUiLCAiaW1hZ2UvIl0sDQogICAgeyJ4LWFtei1tZXRhLXV1aWQiOiAiMTQzNjUxMjM2NTEyNzQifSwNCiAgICB7IngtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24iOiAiQUVTMjU2In0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sDQoNCiAgICB7IngtYW16LWNyZWRlbnRpYWwiOiAiQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LA0KICAgIHsieC1hbXotYWxnb3JpdGhtIjogIkFXUzQtSE1BQy1TSEEyNTYifSwNCiAgICB7IngtYW16LWRhdGUiOiAiMjAxNTEyMjlUMDAwMDAwWiIgfQ0KICBdDQp9''' 

z http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html

+0

Co zrobić, jeśli zawartość 'other_policy' jest niepoprawna? Po skorygowaniu problemu za pomocą 'hmac.new (other_policy, SigningKey, hashlib.sha256) .hexdigest()', sprawdziłem podpisywanie tego samego klucza przy użyciu przykładowego kodu źródłowego Java, a podsumowanie jest takie samo z kodu Java i Python. Więc najprawdopodobniej używasz niewłaściwej zawartości dla wartości 'other_policy' –

+0

Myślę, że albo AWS doc przestarzały, albo' other_policy' niepoprawny – dhana

Odpowiedz

4

błąd w kodzie

Twój kod, aby wygenerować klucz podpisywania wygląda dobrze. Jednak po wygenerowaniu podpisu parametry są przełączane. Pseudokod jest:

Hex(HMAC-SHA256(SigningKey, StringToSign)) 

Więc zamiast

signature = hmac.new(other_policy, SigningKey, hashlib.sha256).hexdigest() 

trzeba mieć

signature = hmac.new(SigningKey, other_policy, hashlib.sha256).hexdigest() 

Jeszcze nie tak?

To daje następujący podpis, który mimo dokumentacji Amazon, wierzę, jest zgodny z założonym warunkiem ciąg base64 do podpisania:

8afdbf4008c03f22c2cd3cdb72e4afbb1f6a588f3255ac628749a66d7f09699e 

Więc dlaczego Amazon powiedzieć podpis powinien być 465039...c60fc9 ???

Przykro mi to mówić, nie mam pojęcia. Podejrzewam, że dokumentacja może być rzeczywiście niedokładna, albo w odniesieniu do wartości podpisu, albo w odniesieniu do wartości parametrów wejściowych użytych do jej wygenerowania (tajny klucz, data, region, usługa, ciąg znaków do podpisania).

Mam wrażenie, że wychodzę na kończynę, sugerując coś takiego, ale jednocześnie wiem z doświadczenia, że ​​nie każda dokumentacja techniczna online jest w 100% dokładna (nawet jeśli jest produkowana przez renomowane źródło).

Nie mogłem odtworzyć tego podpisu bez względu na to, co próbowałem. Chciałbym miłość, aby zobaczyć odpowiedź, która pomyślnie produkuje ten skrót.

Dowody

Są naprawdę tylko dwie rzeczy dzieje się tutaj:

  • Oblicz klucza podpisującego.
  • Przekaż go razem z "ciągiem do podpisania" do funkcji haszowania, aby wygenerować podpis.

Twój kod generuje oczekiwany klucz podpisu przy użyciu parametrów podanych w przykładzie pod numerem "Deriving the Signing Key with Other Languages" here. Sugeruje to, że poprawnie obliczasz klucz podpisu.Kod Pythona here.

Twój kod generuje również oczekiwany podpis przy użyciu parametrów z this example. Sugeruje to, że oboje wyliczacie prawidłowy klucz podpisu i prawidłowy podpis. Kod Pythona here.

Uruchamianie parametrów z twojego pytania za pośrednictwem istniejącego kodu Pythona, który znam, aby pracować z kilkoma usługami (na podstawie this), również generuje ten sam podpis 8afdb...9699e.

Również rzuciłem java signing code into an existing spring boot application, a także produkuje ten sam podpis 8afdb...9699e dla parametrów wejściowych.

Czego spróbować?

Proponuję założyć, że twój kod podpisu jest dobry, a dokumentacja AWS na tej konkretnej stronie jest w błędzie. W końcu twój kod działa dobrze z przynajmniej dwoma innymi przykładami AWS.

Zarejestruj się prawdziwe wniosek, korzystając swoje poświadczenia swoją politykę wiadra, region, aktualną datę, itp

następnie po formę próbki i sprawdzić, czy to działa. Jeśli to nie zadziała, możesz zaktualizować pytanie błędem z formularza POST.

+0

+1 dla szczegółowych informacji, próbuję przesłać obrazy od klienta (javascript) do s3, I generowanie s4 podpis z backendu (python). Niestety nie mogę przesłać obrazu. Z powodu minusa z podpisem. Czy masz dokument dla kompletnego procesu S4 dla mojej potrzeby. Próbowałem na wiele sposobów, ale mi się nie udało. – dhana

+0

Nie mogłem znaleźć żadnej dokumentacji specyficznej dla S3, która jest lepsza niż ta, z którą już się łączyłeś. Jednak ten przykład _ działa dla mnie, jeśli zaktualizuję daty i wskażę go w posiadanym przeze mnie kubku. Oto pliki, które testowałem (https://github.com/mikepatrick/s3-upload-sig4). –