JMeter выдает ошибку «Подпись не совпадает» при загрузке файла в s3 - PullRequest
0 голосов
/ 18 февраля 2020

Может ли кто-нибудь помочь мне выяснить, что происходит?

Я пытаюсь загрузить тестовое приложение, в которое пользователь может загружать и скачивать файлы.

Путешествие:

Шаг 1: Когда пользователь выбирает файл с диска (запрос POST), он создает fileID и путь с uuid.

Ответ выглядит следующим образом: {"id":"FILE-VX-1234","path":"uuid/filename.jpg","uri":["s3://{location}/{uuid}/{filename}?endpoint=s3.dualstack.eu-west-1.amazonaws.com"],"state":"OPEN","size":-1,"timestamp":"2020-02-13T10:59:43.146+0000","refreshFlag":1,"storage":"STORAGEID","metadata":{}

Шаг 2: Использование этих (POST-запрос), который отвечает с помощью s3 uri с помощью оценки ключа ключа, secrettaccesskey и sessionToken.

Ответ выглядит следующим образом: {"uri":["s3://{accesskeyID}:{secretaccesskey}@{storage location}/{uuid}/{filename}?endpoint=s3.dualstack.eu-west-1.amazonaws.com&sessionToken={security token}"]}

Шаг 3: Использование этих и добавленных временных параметров (дата), запрос PUT загружает файл в корзину s3.

Заголовок выглядит следующим образом:

Accept: */*

Accept-Encoding: gzip, deflate, br

Accept-Language: en-GB,en-US;q=0.9,en;q=0.8

Authorization: AWS4-HMAC-SHA256 Credential=${accesskeyID}/${currentDate}/{region}/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=${secretaccesskey}

Connection: keep-alive

Content-Length: 145541

Content-Type: image/jpeg

Host: <the host address>

Origin: https://{url}

Referer: https://{url}/upload/

Sec-Fetch-Mode: cors

Sec-Fetch-Site: cross-site

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36

X-Amz-Content-Sha256: UNSIGNED-PAYLOAD

X-Amz-Date:${currentDateInUTC}

x-amz-security-token: ${sessionToken}

X-Amz-User-Agent: aws-sdk-js/2.409.0 callback

Ошибка: SignatureDoesNotMatch Рассчитанная нами подпись запроса не соответствует предоставленной вами подписи. Проверьте свой ключ и метод подписи.

Я проверил правильность подписи (secrettaccesskey), accesskeyID и sessionToken, которые передаются в запросе PUT.

Примечание. Дополнительные параметры date и "{region} / s3 / aws4_request, SignedHeaders = host; x-amz-content-sha256; x-amz-date; x-amz-security-token; x-amz-user-agent" в Ошибка авторизации жестко запрограммирована.

1 Ответ

0 голосов
/ 19 февраля 2020

Невозможно оказать какую-либо помощь, не видя, как вы генерируете подпись для запроса, например Authorization заголовок

Согласно Подпись и аутентификация REST Запросы article

REST API Amazon S3 использует собственную схему HTTP, основанную на ключе HMA C (Ha sh Код аутентификации сообщения) для аутентификации. Чтобы аутентифицировать запрос, вы сначала объединяете выбранные элементы запроса, чтобы сформировать строку. Затем вы используете свой секретный ключ доступа AWS для вычисления HMA C этой строки. Неформально мы называем этот процесс «подписанием запроса» и называем вывод алгоритма HMA C сигнатурой, поскольку он имитирует свойства безопасности реальной сигнатуры. Наконец, вы добавляете эту подпись в качестве параметра запроса, используя синтаксис, описанный в этом разделе.

Вот псевдокод, демонстрирующий, как должен быть сгенерирован заголовок:

Authorization = "AWS" + " " + AWSAccessKeyId + ":" + Signature;

Signature = Base64( HMAC-SHA1( YourSecretAccessKey, UTF-8-Encoding-Of( StringToSign ) ) );

StringToSign = HTTP-Verb + "\n" +
    Content-MD5 + "\n" +
    Content-Type + "\n" +
    Date + "\n" +
    CanonicalizedAmzHeaders +
    CanonicalizedResource;

CanonicalizedResource = [ "/" + Bucket ] +
    <HTTP-Request-URI, from the protocol name up to the query string> +
    [ subresource, if present. For example "?acl", "?location", "?logging", or "?torrent"];

CanonicalizedAmzHeaders = <described below>

Вы можете проверить Как обрабатывать Dynami c AWS SigV4 в JMeter для тестирования API Статья для примера реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...