Инструкция описывает подписание запросов к API Object Storage с помощью подписи AWS Signature V4. Подпись нужна, чтобы аутентифицировать запрос.
При использовании готовых инструментов запросы к API Object Storage подписываются автоматически. Если вы отправляете запросы к API напрямую, без использования специализированных приложений, подпишите запрос вручную:
Добавьте подпись к запросу: используйте ее в заголовке Authorization или создайте подписанную ссылку (presigned URL).
Перед началом работы
Чтобы работать с API Object Storage, создайте ключ доступа:
Авторизуйтесь в личном кабинете.
Создайте ключ доступа одним из способов:
Создайте сервисный аккаунт и сгенерируйте ключ доступа для него.
Сохраните Key ID (логин) и Key Secret (пароль).
Сохраните идентификатор тенанта.
В личном кабинете на верхней панели слева нажмите
и выберите Хранение данных → 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. Отсортируйте заголовки в алфавитном порядке и укажите их в нижнем регистре без пробелов. Название и значение каждого заголовка разделите двоеточием :. Например:
|
<SignedHeaders> | Имена заголовков без значений, отсортированные в алфавитном порядке, в нижнем регистре, через точку с запятой ;. Например:
|
<HashedPayload> | Хеш SHA256 тела запроса Hex(SHA256Hash(<body>)), где <body> — тело запроса. Если тела запроса нет, рассчитайте хеш от пустой строки: Hex(SHA256Hash("")). |
Пример канонического запроса для получения объекта:
GET/s3.cloud.ru/my-bucket/my-file.txthost:s3.cloud.rux-amz-content-sha256:e3b0c...x-amz-date:20230101T220855Zhost;x-amz-content-sha256;x-amz-datee3b0c...
Шаг 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")
При первом вызове функции используйте параметры:
<key_secret> — Key Secret (пароль) ключа доступа к API Object Storage.
<yyyymmdd> — текущая дата.
Для генерации DateRegionKey, DateRegionServiceKey и SigningKey используйте результаты предыдущих вызовов функции.
Шаг 4. Подпишите строку ключом
Подпись вычисляется как хеш строки для подписи StringToSign и подписывающего ключа SigningKey. Рассчитайте хеш с помощью алгоритма HMAC-SHA256 и переведите полученное значение в формат HEX:
Signature = Hex(HMAC-SHA256(SigningKey, StringToSign))
Добавьте подпись к запросу
Чтобы аутентифицировать запрос, добавьте подпись к нему одним из способов:
используйте подпись в HTTP-заголовке Authorization;
добавьте подпись в query-параметры запроса — так будет сформирована подписанная ссылка (presigned URL).
Аутентификация через 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 | Список имен заголовков, которые использовались при вычислении подписи. Обязательные заголовки:
Для дополнительной безопасности рекомендуется подписывать все заголовки. |
X-Amz-Signature | Вычисленная подпись. |