Я следующие шаги, чтобы создать запрос PUT с помощью V4: http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.htmlSignatureDoesNotMatch при попытке поместить объект в REST API из JSP - AWS V4 подписи
только что создали JSP для пытается загрузить файл ведро S3. Проблема в том, что я всегда получаю 403 - Запрещено. Если посмотреть на ответ в деталях, это означает, что сообщение «SignatureDoesNotMatch» содержит сообщение «Подписанная нами подпись запроса не соответствует вашей подписке. Проверьте свой ключ и метод подписи. ' Содержимое на самом деле представляет собой только строку «Содержимое файла». Это заголовки отправляемые:
PUT /test.txt HTTP/1.1
Accept:/
Host: my host.s3.amazonaws.com
Date: Thu, 22 Sep 2016 04:51:52 GMT
Authorization: AWS4-HMAC-SHA256 Credential=My access ID/20160922/us-east-1/s3/aws4_request,SignedHeaders=date;host;x-amz-content-sha256;x-amz-date;x-amz-storage-class,Signature=1bqb/RTdtsOP42zs7UR4d6Id6YlNgIbO86Q1m2RuGFs=
x-amz-date: 20160922T045152Z
x-amz-content-sha256: 69423BABE8E61AAB549F347BCC8B9D77B7DCACA198FB0597BDE0B5F97F968E38
x-amz-storage-class: REDUCED_REDUNDANCY
Content-Type: text/plain
Content-Length: 13
Значимые части тела ответа таковы:
<CanonicalRequest>PUT
/test.txt
content-length:13
content-type:text/plain
date:Thu, 22 Sep 2016 04:51:52 GMT
host:my host.s3.amazonaws.com
x-amz-content-sha256:69423BABE8E61AAB549F347BCC8B9D77B7DCACA198FB0597BDE0B5F97F968E38
x-amz-date:20160922T045152Z
x-amz-storage-class:REDUCED_REDUNDANCY
content-length;content-type;date;host;x-amz-content-sha256;x-amz-date;x-amz-storage-class
69423BABE8E61AAB549F347BCC8B9D77B7DCACA198FB0597BDE0B5F97F968E38</CanonicalRequest>
<StringToSign>AWS4-HMAC-SHA256
20160922T045152Z
20160922/us-east-1/s3/aws4_request
17957a94c148833cd2f1132a8a4ffcfe6d2c83a71501a063f7a2ff9e7acfa1aa</StringToSign>
<SignatureProvided>1bqb/RTdtsOP42zs7UR4d6Id6YlNgIbO86Q1m2RuGFs</SignatureProvided>
Я уверен, что CanonicalRequest и StringToSing равны на ответ я получаю и запрос I 'm create, так как мы регистрируем всю эту информацию для отладки на данный момент. Только путем сравнения, я могу гарантировать, что данные точно так же для «=» символ в конце подписи, за исключением:
Подпись на Authorization Заголовок:
1bqb/RTdtsOP42zs7UR4d6Id6YlNgIbO86Q1m2RuGFs=
SignatureProvided в теле ответа:
1bqb/RTdtsOP42zs7UR4d6Id6YlNgIbO86Q1m2RuGFs
Я просто не могу понять, почему я получаю эту ошибку SignatureDoesNotMatch, кажется, что все нормально. Я создал код, который я использую для создания запроса.
Есть ли что-то, что мне не хватает? Я впервые пытаюсь интегрироваться с AWS. Я уже потратил много дней, пытаясь заставить его работать, это очень раздражает :(
Заранее спасибо за помощь
EDIT: удаления последнего символа «=» из подписи не работал, такой же результат, как и выше.
похоже, что в процессе создания подписи вы используете URL-кодирование, которое добавляет дополнительные «=». Я не уверен в процессе создания подписи. –
Спасибо за ваш ответ Rahul! Я создаю макрос HmacSHA256 и подписываюсь с моим AWSSecretKey. Преобразование обратно в String с DatatypeConverter.printBase64Binary, не уверен, где имеет место кодировка URL-адреса – nnimis