2015-10-30 60 views
0

我試圖執行HTTP PUT來創建和更新對象,同時指定自定義元數據標題。我在生成正確的簽名時遇到困難,而我沒有爲其他請求的操作生成簽名的問題。這是我基本的bash/CURL示例。我要強調,我必須在我的具體情況看,並使用Bash和捲曲,不能利用s3curl,或其他庫的CLI或:使用CURL的元數據創建S3對象失敗

#!/bin/bash 

file="$1" 

key_id="raanan" 
key_secret="my-secret" 
url="my-s3-endpoint" 
bucket="testbucket" 
path="$file" 
content_type="application/octet-stream" 
date="$(LC_ALL=C date -u +"%a, %d %b %Y %X %z")" 
md5="$(openssl md5 -binary < "$file" | base64)" 
daheader="x-amz-meta-user:qatester\n" 
sig="$(printf "PUT\n$md5\n$content_type\n$date\n$daheader$bucket/$path" |  
openssl sha1 -binary -hmac "$key_secret" | base64)" 
curl -k -w "@curl-format.txt" -T $file http://my-s3-endpoint/$bucket$path -vv \ 
-H "Date: $date" \ 
-H "Authorization: AWS $key_id:$sig" \ 
-H "Content-Type: $content_type" \ 
-H "Content-MD5: $md5" \ 
-H "x-amz-meta-user: qatester" 

>>>>HTTP/1.1 403 Forbidden 
>>>>?xml version="1.0" encoding="UTF-8" standalone="yes"?><Error> 
<Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated 
does not match the signature you provided. Check your secret access key and signing method.</Message><Resource></Resource><RequestId></RequestId> </Error> 

我在這裏失去了一些東西?

感謝

+0

你在這裏使用什麼版本的簽名?這個方法的文檔在哪裏? –

+0

嗨,v4簽名和文檔在這http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html。 –

+0

我沒有在任何地方看到該文檔中引用的md5。你確定你在你的代碼中遵循這些方向,而不是舊版本嗎? –

回答

1

你似乎缺少桶名稱前的/

date\n$daheader$bucket/$path # incorrect 
date\n$daheader/$bucket/$path # correct 

您還缺少你交給捲曲實際的URL /後桶的名字。

curl -k -w "@curl-format.txt" -T $file http://my-s3-endpoint/$bucket$path -vv \ # incorrect 
curl -k -w "@curl-format.txt" -T $file http://my-s3-endpoint/$bucket/$path -vv \ # correct 

有了這兩個變化,腳本對我很有用。

還請注意,這是而不是簽名V4。這是Signature V2

+0

$ date \ n $ daheader/$ bucket/$ path「也不起作用。我原本是這樣試過的,但是也失敗了。 –

+0

更新了bug#2。 –

+0

謝謝各位! --->我們已經完全上傳並且很好