2017-02-14 4 views
1

Я пытаюсь создать сигнатуру AWS4 для загрузки в ведро S3 непосредственно из браузера клиента. Я генерация подписи в C# с использованием примера здесь:Aws Signature Version 4 Политика не соответствует примеру

AWS - Deriving the Signing Key with .NET (C#)

Чтобы убедиться в том, что политика и подпись генерируются правильно, я использовал ключи доступа и политику из примера здесь:

AWS - Examples: Browser-Based Upload using HTTP POST (Using AWS Signature Version 4)

Я пробовал несколько методов для создания политики, и это не соответствует. Я даже копировал и вставлял точную строку политики из примера. Так почему это не работает:

var policy = "{ \"expiration\": \"2015-12-30T12:00:00.000Z\"," + 
        "\"conditions\": [" + 
        "{\"bucket\": \"sigv4examplebucket\"}," + 
        "[\"starts-with\", \"$key\", \"user/user1/\"]," + 
        "{\"acl\": \"public-read\"}," + 
        "{\"success_action_redirect\": \"http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html\"}," + 
        "[\"starts-with\", \"$Content-Type\", \"image/\"]," + 
        "{\"x-amz-meta-uuid\": \"14365123651274\"}," + 
        "{\"x-amz-server-side-encryption\": \"AES256\"}," + 
        "[\"starts-with\", \"$x-amz-meta-tag\", \"\"]," + 
        "{\"x-amz-credential\": \"AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request\"}," + 
        "{\"x-amz-algorithm\": \"AWS4-HMAC-SHA256\"}," + 
        "{\"x-amz-date\": \"20151229T000000Z\" }]}"; 

// hash the Base64 version of the policy document and pass this to the signer as the body hash 
var policyStringBytes = Encoding.UTF8.GetBytes(policy); 
return Convert.ToBase64String(policyStringBytes); 

пример говорит о том, что строка должна быть политика:

eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJzaWd2NGV4YW1wbGVidWNrZXQifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwNCiAgICB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRDb250ZW50LVR5cGUiLCAiaW1hZ2UvIl0sDQogICAgeyJ4LWFtei1tZXRhLXV1aWQiOiAiMTQzNjUxMjM2NTEyNzQifSwNCiAgICB7IngtYW16LXNlcnZlci1zaWRlLWVuY3 J5cHRpb24iOiAiQUVTMjU2In0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sDQoNCiAgICB7IngtYW16LWNyZWRlbnRpYWwiOiAiQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LA0KICAgIHsieC1hbXotYWxnb3JpdGhtIjogIkFXUzQtSE1BQy1TSEEyNTYifSwNCiAgICB7IngtYW16LWRhdGUiOiAiMjAxNTEyMjlUMDAwMDAwWiIgfQ0KICBdDQp9

Но метод выше возвращает:

eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLCJjb25kaXRpb25zIjogW3siYnVja2V0IjogInNpZ3Y0ZXhhbXBsZWJ1Y2tldCJ9LFsic3RhcnRzLXdpdGgiLCAiJGtleSIsICJ1c2VyL3VzZXIxLyJdLHsiYWNsIjogInB1YmxpYy1yZWFkIn0seyJzdWNjZXNzX2FjdGlvbl9yZWRpcmVjdCI6ICJodHRwOi8vc2lndjRleGFtcGxlYnVja2V0Ln MzLmFtYXpvbmF3cy5jb20vc3VjY2Vzc2Z1bF91cGxvYWQuaHRtbCJ9LFsic3RhcnRzLXdpdGgiLCAiJENvbnRlbnQtVHlwZSIsICJpbWFnZS8iXSx7IngtYW16LW1ldGEtdXVpZCI6ICIxNDM2NTEyMzY1MTI3NCJ9LHsieC1hbXotc2VydmVyLXNpZGUtZW5jcnlwdGlvbiI6ICJBRVMyNTYifSxbInN0YXJ0cy13aXRoIiwgIiR4LWFtei1tZXRhLXRhZyIsICIiXSx7IngtYW16LWNyZWRlbnRpYWwiOiAiQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LHsieC1hbXotYWxnb3JpdGhtIjogIkFXUzQtSE1BQy1TSEEyNTYifSx7IngtYW16LWRhdGUiOiAiMjAxNTEyMjlUMDAwMDAwWiIgfV19

Если я не могу даже получить строку политики, чтобы соответствовать, то нет никакой надежды в создании сопрягая подпись.

+0

Используйте '\ n' для новой строки – hjpotter92

+0

*« Если я даже не могу получить строку политики, чтобы соответствовать, то нет надежды на создание соответствующей подписи. * «На самом деле, это не совсем так в этом дело. Вы правы, подпись не будет соответствовать этому примеру ... но до тех пор, пока кодировка base64 * правильно * для документа политики, и до тех пор, пока документ политики действителен JSON (где пробелы не имеют смысла) вы придумаете * другую, но все же действительную * подпись, потому что это запрос, который физически отличается, но логически эквивалентен. Тем не менее, престиж для работы по книге. –

+0

О, да ... не пытайтесь строить эти вещи вручную. Используйте библиотеку, которая фактически кодирует JSON. –

ответ

0

в основном это то, что вам нужно. на основе вывода страницы документации, скопируйте и вставьте код base64 в https://www.base64decode.org/ и щелкните по расшифровке. Это покажет декодированный контент json.

Я сделал это, и я сравнил его с вашим содержанием json. - как было упомянуто @ hjpotter92, вам нужно иметь \ п для новых линий - вы должны смотреть на пространствах

пример показывает

<space>"conditions": [ и <space><space><space><space>{"bucket": "sigv4examplebucket"},

, но ваш код показывает

"conditions": [ и {"bucket": "sigv4examplebucket"},

надеюсь, что это поможет.

+0

Благодаря hjpotter92 и Titi Wangsa bin Damhore. @ hjpotter92 ввел меня в себя и в основном добрался до места, где была Тити. Это была комбинация возврата каретки и пробелов. FYI в C# мне пришлось использовать «\ r \ n», чтобы заставить его правильно кодировать. На плюс стороне подпись теперь соответствует примеру тоже :) – gsxrboy73

Смежные вопросы