本文在AWS開發者博客介紹瞭如何生成,將在服務器端進行加密S3文件前簽署的網址:https://aws.amazon.com/blogs/developer/generating-amazon-s3-pre-signed-urls-with-sse-kms-part-2/。描述如何生成url的部分是有道理的,但接下來文章將繼續描述如何在put請求中使用url,並且它說除了生成的url之外,還必須添加到http請求中指定加密算法的頭部。爲什麼在加密算法包含在url代中時這是必要的?爲什麼我們必須在http頭中指定服務器端加密?
// Generate a pre-signed PUT URL for use with SSE-KMS
GeneratePresignedUrlRequest genreq = new GeneratePresignedUrlRequest(
myExistingBucket, myKey, HttpMethod.PUT)
.withSSEAlgorithm(SSEAlgorithm.KMS.getAlgorithm());
...
HttpPut putreq = new HttpPut(URI.create(puturl.toExternalForm()));
putreq.addHeader(new BasicHeader(Headers.SERVER_SIDE_ENCRYPTION,
SSEAlgorithm.KMS.getAlgorithm()));
我問一部分是由於好奇,也因爲有從生成URL中的一個執行不同的機器上我的情況PUT請求正在運行的代碼。我不會詳細討論,但確保一臺機器生成的標題與另一臺機器生成的url相匹配是一件非常麻煩的事情。