使用签名Cookie从CloudFront提供私人内容

Laz*_*aza 3 amazon-web-services amazon-cloudfront

Cloudfront支持签名cookie以提供私有内容,但我无法找到有关如何执行此操作的任何示例.

我已经找到了如何使用Java AWS API签署URL而不是Cookie的示例,有人可以分享他们这样做的经验,这是确保从CloudFront提供多种媒体形式的最佳方式.

我们的网站上有用户上传的图片和视频,然后可以通过我们网站上的搜索进行查看,我想确保这些图片只能由我们的网站提供,不能复制供以后使用.

小智 7

我们能够使用此库引入带有自定义策略的签名cookie

http://www.jets3t.org/

您需要使用您的应用创建的三个Cookie,如 http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-custom-policy.html所述

请仔细阅读.特别是关于如何创建策略的部分.

这三个饼干是:

  1. CloudFront的-政策
  2. CloudFront的签名
  3. CloudFront的-密钥对-ID

首先制定政策

Date expirationTime = (new LocalDate()).plusYears(1).toDate();
String customPolicy = CloudFrontService.buildPolicyForSignedUrl(basePath, expirationTime, null, null);

//and assign it to a cookie

Cookie signedCookiePolicy = new Cookie("CloudFront-Policy", ServiceUtils.toBase64(customPolicy.getBytes()));
signedCookiePolicy.setMaxAge(365 * 24 * 60 * 60);
signedCookiePolicy.setPath("/");
response.addCookie(signedCookiePolicy);
Run Code Online (Sandbox Code Playgroud)

签名是棘手的部分,但是一旦你使用这个jets3t的东西,所有工具都可用

byte[] signatureBytes = EncryptionUtil.signWithRsaSha1(getDerPrivateKey(), customPolicy.getBytes("UTF-8"));
String signature = ServiceUtils.toBase64(signatureBytes).replace('+', '-').replace('=', '_').replace('/', '~');
Cookie signedCookieSignagture = new Cookie("CloudFront-Signature",cdnSignService.signBaseUrl(basePath, expirationTime));
signedCookieSignagture.setMaxAge(365 * 24 * 60 * 60);
signedCookieSignagture.setPath("/");
response.addCookie(signedCookieSignagture);
Run Code Online (Sandbox Code Playgroud)

第三个cookie仅包含您的AWS账户的密钥ID.

Cookie signedCookieKeyPairId = new Cookie("CloudFront-Key-Pair-Id","YOUR_AWS_CF_KEY_ID");
signedCookieKeyPairId.setMaxAge(365 * 24 * 60 * 60);
signedCookieKeyPairId.setPath("/");
response.addCookie(signedCookieKeyPairId);
Run Code Online (Sandbox Code Playgroud)

以上仅介绍使用正确的库创建签名cookie的概念.它本身不可执行或可运行.

很好,这是我的第一次溢出贡献..