2015-05-06 4 views
1

В настоящее время я реализую приложение для создания подписей Amazon AWS Signature Version 4 (подробности о процессе подписания см. На этой странице: http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html). Удобно, Amazon также поставляет набор тестов для этих подписей. Однако есть один тестовый пример, который я не могу понять. Обратите внимание, что мой вопрос относится только к первому этапу процесса подписания (генерированию канонического запроса) и, в частности, к созданию канонической строки запроса.URL-кодированная строка запроса в соответствии с спецификациями AWS Amazon

запрос ввода HTTP Тестовый пример выглядит следующим образом:

POST /[email protected]#$%^&+=/,?><`";:\|][{} [email protected]#$%^&+=/,?><`";:\|][{} http/1.1 
Date:Mon, 09 Sep 2011 23:36:00 GMT 
Host:host.foo.com 

И это ожидаемый результат для канонического запроса:

POST 
/
%20=%2F%2C%3F%3E%3C%60%22%3B%3A%5C%7C%5D%5B%7B%7D&%40%23%24%25%5E= 
date:Mon, 09 Sep 2011 23:36:00 GMT 
host:host.foo.com 

date;host 
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 

Третья строка в каноническом запросе обозначает url- кодированной строки запроса. Но я действительно не понимаю, как они получают там от входа, даже следуя правила, изложенные в документации Sig V4:

Для построения канонической строки запроса, выполните следующие действия:

URI-кодирование каждого имя и значение параметра в соответствии со следующими правилами:

не URL-кодирование любые из безоговорочных символов, RFC 3986 определяет:

AZ, AZ, 0-9, дефис (-), знак подчеркивание (_) , период (.) и тильда (~). Процент-кодировать все остальные символы с% XY, где X и Y - шестнадцатеричные символы (0-9 и верхний регистр A-F).

Например, символ пробела должен быть закодирован как% 20 (не используется «+», как это делают некоторые схемы кодирования), а расширенные символы UTF-8 должны быть в форме% XY% ZA% BC.

Сортировка имен закодированных параметров по коду символов (то есть в строгом порядке ASCII). Например, имя параметра, начинающееся с прописной буквы F (код ASCII 70), предшествует имени параметра, которое начинается с буквы нижнего регистра b (код ASCII 98).

Построить каноническую строку запроса, начав с имени первого параметра в отсортированном списке.

Для каждого параметра добавьте имя параметра, кодированного URI, а затем символ «=» (код ASCII 61), за которым следует значение параметра, закодированного в URI. Используйте пустую строку для параметров, которые не имеют значения.

Добавить символ '&' (код ASCII 38) после каждого значения параметра, за исключением последнего значения в списке.

Может кто-нибудь объяснить? Спасибо за кучу заранее!

ответ

0

Думаю, я мог бы это понять.Разлагая строку запроса @#$%^&+=/,?><``";:\|][{} [email protected]#$%^&+=/,?><``";:\|][{} в пар ключ/значение (в порядке появления):

  1. Ключ @#$%^, Значение None
  2. Ключ +, Value /,?><``";:\|][{}
  3. Ключ @#$%^, Значение Без
  4. Ключ +, Значение /,?><``";:\|][{}

На основе https://stackoverflow.com/a/1746566/3108853 не существует стандарта на то, что делать с дублирующимися ключами, поэтому похоже, что Amazon просто игнорирует или перезаписывает (невозможно сказать с этим тестовым примером, поскольку значения дубликатов клавиш тоже самое).

Наконец, составляя = до второго появления @#$%^, я считаю, он обрабатывается как ключ/значение пары с null значением ключа, так что при падении все вместе.

+0

Вот и все! Действительно, большое спасибо. Сейчас все фигурирует. Просто небольшая коррекция: 3-й и 4-й ключи отбрасываются из-за пространства в середине строки запроса. Может быть, вы можете отредактировать это выше? Тем не менее, я буду отмечать это как правильный ответ :) – Zasha

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