2017-02-17 13 views
0

Я застрял в очень странной проблеме, пытаясь выполнить запрос GET на AWS S3 с каноническим запросом с параметрами запроса. Ниже мой канонический запрос, который не работает.AWS S3 GET Запрос с параметрами запроса бросает запрет (403) с SignatureDoesNotMatch

Canonical Запрос с Параметрами запроса:

GET 
/
list-type=2&prefix=20170120 
content-type:text/plain 
host:<bucket>.s3-ap-south-1.amazonaws.com 
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b785 
2b855 
x-amz-date:20170217T084710Z 

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

Я получаю это 403 Ошибки в ответ.

<?xml version="1.0" encoding="UTF-8"?> 
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>******MyAccessKey******</AWSAccessKeyId><StringToSign>AWS4-HMAC-SHA256 
20170217T084710Z 
20170217/ap-south-1/s3/aws4_request 
a34d06c9bbfb4f1c6ac8f168843fdac894b40251179cd0846c046bdf25e0576a</StringToSign><SignatureProvided>c6ac3eaba7b1ba2f4e83c296a5132aaed76d96845e995896db0490a1850d5934</SignatureProvided><StringToSignBytes>41 57 53 34 2d 48 4d 41 43 2d 53 48 41 32 35 36 0a 32 30 31 37 30 32 31 37 54 30 38 34 37 31 30 5a 0a 32 30 31 37 30 32 31 37 2f 61 70 2d 73 6f 75 74 68 2d 31 2f 73 33 2f 61 77 73 34 5f 72 65 71 75 65 73 74 0a 61 33 34 64 30 36 63 39 62 62 66 62 34 66 31 63 36 61 63 38 66 31 36 38 38 34 33 66 64 61 63 38 39 34 62 34 30 32 35 31 31 37 39 63 64 30 38 34 36 63 30 34 36 62 64 66 32 35 65 30 35 37 36 61</StringToSignBytes><CanonicalRequest>GET 
/

content-type:text/plain 
host:<bucket>.s3-ap-south-1.amazonaws.com 
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 
x-amz-date:20170217T084710Z 

content-type;host;x-amz-content-sha256;x-amz-date 
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855</CanonicalRequest><CanonicalRequestBytes>47 45 54 0a 2f 0a 0a 63 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 74 65 78 74 2f 70 6c 61 69 6e 0a 68 6f 73 74 3a 6d 65 64 69 2d 61 73 73 69 73 74 2e 73 33 2d 61 70 2d 73 6f 75 74 68 2d 31 2e 61 6d 61 7a 6f 6e 61 77 73 2e 63 6f 6d 0a 78 2d 61 6d 7a 2d 63 6f 6e 74 65 6e 74 2d 73 68 61 32 35 36 3a 65 33 62 30 63 34 34 32 39 38 66 63 31 63 31 34 39 61 66 62 66 34 63 38 39 39 36 66 62 39 32 34 32 37 61 65 34 31 65 34 36 34 39 62 39 33 34 63 61 34 39 35 39 39 31 62 37 38 35 32 62 38 35 35 0a 78 2d 61 6d 7a 2d 64 61 74 65 3a 32 30 31 37 30 32 31 37 54 30 38 34 37 31 30 5a 0a 0a 63 6f 6e 74 65 6e 74 2d 74 79 70 65 3b 68 6f 73 74 3b 78 2d 61 6d 7a 2d 63 6f 6e 74 65 6e 74 2d 73 68 61 32 35 36 3b 78 2d 61 6d 7a 2d 64 61 74 65 0a 65 33 62 30 63 34 34 32 39 38 66 63 31 63 31 34 39 61 66 62 66 34 63 38 39 39 36 66 62 39 32 34 32 37 61 65 34 31 65 34 36 34 39 62 39 33 34 63 61 34 39 35 39 39 31 62 37 38 35 32 62 38 35 35</CanonicalRequestBytes><RequestId>053E8FA17F65DD3D</RequestId><HostId>b+BWn4unlVXDA28WO6H+R6T7cLSdwADlsCxGmzlbjTI3jGpAY5jNVedAcL7Jta5zcCISd2R7e6o=</HostId></Error> 

Теперь, когда я делаю то же запрос без строки запроса, он отлично работает.

Canonical Запрос, который работает

GET 
/

content-type:text/plain 
host:<bucket>.s3-ap-south-1.amazonaws.com 
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b785 
2b855 
x-amz-date:20170217T094656Z 

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

Мои учетные данные имеют права администратора, поэтому все действия разрешены на ведро. Может кто-нибудь, пожалуйста, помогите мне указать, что я делаю неправильно здесь?

ответ

1

Только что осознал свою ошибку при рассмотрении вопроса. При прохождении запроса у меня отсутствовал параметр строки запроса. Именно там и происходила проблема. Я должен был проверить ответ Canonical Request String, который явно показывает строку запроса.

Некорректное URI: https://<bucket>.s3-ap-south-1.amazonaws.com/ Это приведет к ошибке, как S3 не появится параметр строки запроса в запросе, но то же самое будет доступно в каноническом Request.

Правильный URI (с параметром строки запроса): https://<bucket>.s3-ap-south-1.amazonaws.com/?list-type=2&prefix=20170120 Это будет работать, как сейчас s3 увидите строку запроса в исходном запросе и то же будет доступен в каноническом запросу, а также.