Облачная платформаEvolution

Подписание запросов с помощью AWS Signature V4

Эта статья полезна?

Инструкция описывает подписание запросов к API Object Storage с помощью подписи AWS Signature V4. Подпись нужна, чтобы аутентифицировать запрос.

При использовании готовых инструментов запросы к API Object Storage подписываются автоматически. Если вы отправляете запросы к API напрямую, без использования специализированных приложений, подпишите запрос вручную:

  1. Добавьте подпись к запросу: используйте ее в заголовке Authorization или создайте подписанную ссылку (presigned URL).

Перед началом работы

Чтобы работать с API Object Storage, создайте ключ доступа:

  1. Авторизуйтесь в личном кабинете.

  2. Создайте ключ доступа одним из способов:

  3. Сохраните Key ID (логин) и Key Secret (пароль).

  4. Сохраните идентификатор тенанта.

    В личном кабинете на верхней панели слева нажмите Кнопка с изображением девяти точек и выберите Хранение данных → Object Storage. Идентификатор тенанта указан над списком бакетов.

Сгенерируйте подпись

Подпись AWS Signature V4 — строка, закодированная ключом с помощью хеш-алгоритма HMAC-SHA256. Строка и подписывающий ключ формируются из закодированных параметров API-запроса.

Чтобы сгенерировать подпись:

Шаг 1. Создайте канонический запрос

Соберите параметры API-запроса в канонический запрос CanonicalRequest формата:

CanonicalRequest = \`
<HTTPMethod>\n
<CanonicalURI>\n
<CanonicalQueryString>\n
<CanonicalHeaders>\n
<SignedHeaders>\n
<HashedPayload>
\`

Описание параметров:

Параметр

Описание

<HTTPMethod>

HTTP-метод запроса: GET, PUT, HEAD или DELETE.

<CanonicalURI>

Путь к ресурсу, к которому относится URI-запрос. Путь начинается с косой черты /, следующей после доменного имени, и продолжается до конца строки или до вопросительного знака ?.

Например, для URL-запроса https://s3.cloud.ru/my-bucket/my-file.txt путь к ресурсу — /my-bucket/my-file.txt.

<CanonicalQueryString>

Параметры строки запроса — все, что следует за вопросительным знаком ? в пути к ресурсу. Отсортируйте параметры в алфавитном порядке по имени ключа и разделите амперсандом &.

Если в запросе нет параметров, оставьте строку пустой \n.

Например, для URL-запроса https://s3.cloud.ru/my-bucket?tag=my-tag&project=my-project список параметров — project=my-project&tag=my-tag.

<CanonicalHeaders>

Заголовки и их значения, разделенные символом новой строки \n. Отсортируйте заголовки в алфавитном порядке и укажите их в нижнем регистре без пробелов. Название и значение каждого заголовка разделите двоеточием :.

Например:

host:s3.cloud.ru
x-amz-content-sha256:e3b0c...
x-amz-date:20230101T220855Z

<SignedHeaders>

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

Например:

host;x-amz-content-sha256;x-amz-date

<HashedPayload>

Хеш SHA256 тела запроса Hex(SHA256Hash(<body>)), где <body> — тело запроса. Если тела запроса нет, рассчитайте хеш от пустой строки: Hex(SHA256Hash("")).

Пример канонического запроса для получения объекта:

GET
/s3.cloud.ru/my-bucket/my-file.txt
host:s3.cloud.ru
x-amz-content-sha256:e3b0c...
x-amz-date:20230101T220855Z
host;x-amz-content-sha256;x-amz-date
e3b0c...

Шаг 2. Сгенерируйте строку для подписи

Сгенерируйте строку для подписи StringToSign на основе канонического запроса. Формат строки:

StringToSign = "AWS4-HMAC-SHA256" + "\n" +
<timeStampISO8601Format> + "\n" +
<Scope> + "\n" +
Hex(SHA256Hash(<CanonicalRequest>))

Описание параметров:

Параметр

Описание

AWS4-HMAC-SHA256

Алгоритм шифрования.

<timeStampISO8601Format>

Текущее время UTC в формате ISO 8601.

Например 20230101T220855Z.

<Scope>

Строка в формате <yyyymmdd>/ru-central-1/s3/aws4_request, где <yyyymmdd> — текущая дата.

<CanonicalRequest>

Шаг 3. Сгенерируйте подписывающий ключ

Подписывающий ключ SigningKey нужен, чтобы закодировать строку для подписи StringToSign, полученную на предыдущем шаге. Чтобы сгенерировать подписывающий ключ, поочередно закодируйте дату, регион и сервис с помощью алгоритма HMAC-SHA256.

Для этого вызовите хеш-функцию несколько раз:

DateKey = HMAC-SHA256("AWS4"+"<key_secret>", "<yyyymmdd>")
DateRegionKey = HMAC-SHA256(DateKey, "ru-central-1")
DateRegionServiceKey = HMAC-SHA256(DateRegionKey, "s3")
SigningKey = HMAC-SHA256(DateRegionServiceKey, "aws4_request")

При первом вызове функции используйте параметры:

Для генерации DateRegionKey, DateRegionServiceKey и SigningKey используйте результаты предыдущих вызовов функции.

Шаг 4. Подпишите строку ключом

Подпись вычисляется как хеш строки для подписи StringToSign и подписывающего ключа SigningKey. Рассчитайте хеш с помощью алгоритма HMAC-SHA256 и переведите полученное значение в формат HEX:

Signature = Hex(HMAC-SHA256(SigningKey, StringToSign))

Добавьте подпись к запросу

Чтобы аутентифицировать запрос, добавьте подпись к нему одним из способов:

Аутентификация через HTTP-заголовок Authorization

Используйте подпись в параметре Signature в HTTP-заголовке Authorization:

Authorization: AWS4-HMAC-SHA256
Credential=<tenant_id>:<key_id>/<yyyymmdd>/ru-central-1/s3/aws4_request,
SignedHeaders=host;range;x-amz-date,
Signature=73325...

Описание параметров:

Параметр

Описание

Authorization

Версия подписи (AWS4) и алгоритм, который использовался для генерации подписи (HMAC-SHA256).

Credential

Информация о запросе в формате

<tenant_id>:<key_id>/<yyyymmdd>/ru-central-1/s3/aws4_request, где:

SignedHeaders

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

Signature

Вычисленная подпись.

Аутентификация через query-параметры

Используйте аутентификацию через query-параметры, если нужно указать все параметры запроса в URL. Такой метод аутентификации позволяет сформировать подписанную ссылку (presigned URL).

Используйте подпись в параметре X-Amz-Signature ссылки:

https://s3.cloud.ru/my-bucket/my-file.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=<tenant_id>:<key_id>/<yyyymmdd>/ru-central-1/s3/aws4_request
&X-Amz-Date=20230101T220855Z
&X-Amz-Expires=86400
&X-Amz-SignedHeaders=host
&X-Amz-Signature=73325...

Описание параметров:

Параметр

Описание

X-Amz-Algorithm

Версия подписи (AWS4) и алгоритм, который использовался для генерации подписи (HMAC-SHA256).

X-Amz-Credential

Информация о запросе в формате

<tenant_id>:<key_id>/<yyyymmdd>/ru-central-1/s3/aws4_request, где:

X-Amz-Date

Время UTC в формате ISO 8601.

Например, 20230101T220855Z.

X-Amz-Expires

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

Например, 86400 секунд (1 день). Допустимые значения: целые числа от 1 до 604800 (7 дней).

X-Amz-SignedHeaders

Список имен заголовков, которые использовались при вычислении подписи. Обязательные заголовки:

  • Host;

  • любой X-Amz-*, который планируется добавить в запрос.

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

X-Amz-Signature

Вычисленная подпись.