本文在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相匹配是一件非常麻烦的事情。