Является ли X-Amz-Expires обязательным заголовком / параметром для запросов к AWS?
Является
X-Amz-Expires
требуемый заголовок / параметр? Официальная документация противоречива и использует ее в некоторых примерах, а не в других.Если это не требуется, каково значение срока действия по умолчанию для подписанного запроса? Соответствует ли это максимально возможному значению для
X-Amz-Expires
параметр, который составляет 604800 (семь дней)?В документации (см. Ссылки выше) говорится о
X-Amz-Expires
параметр только в контексте передачи параметров подписи в строке запроса. ЕслиX-Amz-Expires
параметр является обязательным, требуется ли он только для передачи параметров подписи в строке запроса (в отличие от передачи их с заголовком авторизации)?
Обновить:
В статье " Введение в процессы безопасности AWS" на странице 17 говорится
Запрос должен поступить в AWS в течение 15 минут после отметки времени в запросе. В противном случае AWS отклонит запрос.
Теперь о какой временной отметке мы говорим здесь? Я думаю, что это X-Amz-Date
, Если я прав, то возникает другой вопрос:
- Как
X-Amz-Date
а такжеX-Amz-Expires
параметры относятся друг к другу? Для меня это звучит как алгоритм истечения срока действия запроса отходит до 15 минут отX-Amz-Date
отметка времени, еслиX-Amz-Expire
нет
1 ответ
Является
X-Amz-Expires
требуемый заголовок / параметр?
X-Amz-Expires
используется только с аутентификацией строки запроса, а не с Authorization:
заголовок.
Не существует значения по умолчанию для аутентификации строки запроса. Это обязательный параметр, и служба отклонит запрос, если X-Amz-Algorithm=AWS4-HMAC-SHA256
присутствует в строке запроса, но X-Amz-Expires=...
не является.
<Error>
<Code>AuthorizationQueryParametersError</Code>
...
Теперь о какой временной отметке мы говорим здесь?
Это относится к X-Amz-Date:
при использовании с Authorization:
заголовок. Так как X-Amz-Date:
является частью ввода в алгоритм подписи, изменение даты или времени также изменяет подпись. В противном случае идентичный запрос, подписанный на 1 секунду раньше или позже, имеет совершенно другую подпись. AWS, по сути, позволяет ошибкам часов вашего сервера на срок до 15 минут, не нарушая вашу способность аутентифицировать запросы. Это не запасной вариант или дефолт. Это фиксированное окно.
X-Amz-Date:
из Authorization:
Запросы на основе заголовков сравниваются AWS с их системным временем, которое, конечно, синхронизируется с UTC, и запрос отклоняется, если это происходит вручную, если это значение перекошено от UTC более 15 минут, когда поступает запрос. Никакой другой проверки, связанной с аутентификацией, не происходит до проверки времени.
Проверка истечения срока действия проверки подлинности Query String требует другой логики:
X-Amz-Expires
не должно быть больше 604800 или меньше 0; в противном случае запрос немедленно отклоняется без дальнейшей обработки, включая сообщение, подобное приведенному выше.X-Amz-Date
не должно быть более 15 минут в будущем, согласно системным часам AWS. ОшибкаRequest is not yet valid
,X-Amz-Date
не должно быть больше чемX-Amz-Expires
количество секунд в прошлом по отношению к системным часам AWS, и 15-минутный допуск не применяется. ОшибкаRequest has expired
,
Если возникает какое-либо из этих условий, дальнейшая проверка подписи не производится, поэтому эти сообщения не будут меняться в зависимости от действительности подписи. Это проверяется первым.
Кроме того, самые левые 8 символов вашего X-Amz-Date:
должен соответствовать части даты вашего Credential
компонент Authorization:
заголовок. Сама дата не допускает расхождений с учетными данными (поэтому при подписании не считывайте системное время дважды, в противном случае вы рискуете сгенерировать случайную недействительную подпись около полуночи по Гринвичу).
Наконец, запросы не истекают в процессе обработки. Если вы отправляете запрос, используя любой метод подписи, который считается действительным, когда он прибывает, но срок его действия истечет очень скоро после этого, ему всегда разрешается выполнить до конца - например, загрузка большого S3 или запрос создания снимка EBS не начнутся., затем не удается продолжить, поскольку таймер истечения времени срабатывает, когда запрос уже запущен на стороне AWS. Если действие было запрошено по запросу, оно продолжается и завершается как обычно.