2016-09-22 4 views
0

Я следующие шаги, чтобы создать запрос 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: удаления последнего символа «=» из подписи не работал, такой же результат, как и выше.

+0

похоже, что в процессе создания подписи вы используете URL-кодирование, которое добавляет дополнительные «=». Я не уверен в процессе создания подписи. –

+0

Спасибо за ваш ответ Rahul! Я создаю макрос HmacSHA256 и подписываюсь с моим AWSSecretKey. Преобразование обратно в String с DatatypeConverter.printBase64Binary, не уверен, где имеет место кодировка URL-адреса – nnimis

ответ

0

быстрый поиск Google сказал мне, что дополнительные «=» на самом деле добавлен коэффициент заполнения и еще более быстрый тест помог мне найти способ кодирования без этого дополнения.

@Test 
public void testSign(){ 
    byte[] b = Base64.getDecoder().decode("1bqb/RTdtsOP42zs7UR4d6Id6YlNgIbO86Q1m2RuGFs="); 
    System.out.println(Base64.getEncoder().withoutPadding().encodeToString(b)); 
} 

Не удивительно, если я удалю безPadding(), я получаю = в конце, возможно, вы можете использовать java.net.Base64 для кодирования без заполнения.

+0

Просто заметили, что пользовательская кодировка base64 в Amazon SDK ... не является обычным способом (а не какой-либо собственной java-библиотекой): https://github.com /aws/aws-sdk-java/blob/8ca2018dbc4a7958c3626171e28ec467bd4a32a7/aws-java-sdk-core/src/main/java/com/amazonaws/util/Base64Codec.java Будет использовать их SDK сейчас и возобновить эту работу позже, я потеряли слишком много времени с этим уже. Еще раз спасибо Рахул! – nnimis

Смежные вопросы