适用于 Java 的 亚马逊云科技 开发工具包 2.x 现在支持亚马逊 CloudFront 签名 URL 和 Cookie

作者: David Ho |

我们很高兴地宣布,适用于 Java 的 A WS 开发工具包 2.x 中 已正式推出亚马逊 CloudFront 签名 URL 和签名 cookie 。 现在,您可以通过 CloudFront 安全地提供私有内容,要求您的用户使用特殊的 CloudFront 签名 URL 或签名 Cookie 来访问您的内容。要配置您的 CloudFront 分配以使用此功能,您必须将可信密钥组(推荐)或 亚马逊云科技 账户指定为可信签名者。有关设置和配置 CloudFront 发行版的更多信息,请参阅 开发人员指南

新的软件开发工具包 2.x CloudFrontUtilities 组件提供了许多客户在适用于 Java 的 亚马逊云科技 开发工具包 1.x 中缺少的备受要求的签名功能。SDK 2.x API 中的新 API 已通过一个入口点进行了重新设计,以简化使用体验。

动机

您可以使用签名 URL 或签名 Cookie 来控制对内容的访问权限。签名 URL 允许您创建一个新的 URL,该网址可以临时访问您受保护的 CloudFront 资源之一。签名 Cookie 允许您创建一组临时证书,您的客户可以使用这些证书直接访问一个或多个受保护的 CloudFront 资源。

使用云端签名

1) 为 CloudFront 添加依赖关系

入门的第一步是在您的项目中添加 CloudFront 的依赖关系。

<dependency>
  <groupId>software.amazon.awssdk</groupId>
  <artifactId>cloudfront</artifactId>
  <version>2.18.26</version> <!-- Update to use the latest version. -->
</dependency>

我们建议使用 最新 版本的 SDK。

2) 实例化 CloudFrontUtilities 类

要实例化实用程序类,你只需要调用 c reate ()

import software.amazon.awssdk.services.cloudfront.CloudFrontUtilities;

CloudFrontUtilities cloudFrontUtilities = CloudFrontUtilities.create();

3) 创建 CloudfrontSigner 请求

接下来,你要使用生成器创建 CloudFrontSignerReques t。请求可以同时用于网址和 cookie。

示例 #1:带有固定政策的已签名请求

对于带有固定策略的 URL/Cookie,请创建 c annedSignerRequest ,指定资源网址、私钥、公钥 ID 和到期日期。

import software.amazon.awssdk.services.cloudfront.model.CannedSignerRequest;
import java.security.PrivateKey;
import java.time.Instant;
import java.time.temporal.ChronoUnit;


Instant expirationDate = Instant.now().plus(7, ChronoUnit.DAYS);
String resourceUrl = "https://d1npcfkc2mojrf.cloudfront.net/s3ObjectKey";
String keyPairId = "myKeyPairId";
PrivateKey privateKey = myPrivateKey; // Either PrivateKey or Path can be passed in
CannedSignerRequest cannedRequest = CannedSignerRequest.builder()
                                                       .resourceUrl(resourceUrl)
                                                       .privateKey(privateKey)
                                                       .keyPairId(keyPairId)
                                                       .expirationDate(expirationDate)
                                                       .build();

示例 #2:使用自定义策略签名的请求

对于具有自定义策略的 URL/Cookie,请创建一个 Cu stomSignerRequ es t,您还可以在其中指定有效日期和/或 IP 范围。在此示例中,我们指定了活动日期和 IP 范围,但您可以选择仅指定其中一个。

import software.amazon.awssdk.services.cloudfront.model.CustomSignerRequest;
import java.nio.file.Path;
import java.time.Instant;
import java.time.temporal.ChronoUnit;


Instant expirationDate = Instant.now().plus(7, ChronoUnit.DAYS);
String resourceUrl = "https://d111111abcdef8.cloudfront.net/s3ObjectKey";
String keyPairId = "myKeyPairId";
Instant activeDate = Instant.now().plus(2, ChronoUnit.DAYS);
String ipRange = "192.168.0.1/24";
Path keyFile = myKeyFile; // Either PrivateKey or Path can be passed in

CustomSignerRequest customRequest = CustomSignerRequest.builder()
                                                       .resourceUrl(resourceUrl)
                                                       .privateKey(keyFile)
                                                       .keyPairId(keyPairId)
                                                       .expirationDate(expirationDate)
                                                       .activeDate(activeDate) //optional
                                                       .ipRange(ipRange) //optional
                                                       .build();

4) 创建签名网址/签名 Cookie

生成请求后,创建签名 URL 或签名 cookie,您可以选择从中生成由 HTTP 客户端执行的 sdkHttpRequest

示例 #1:采用固定政策的签名 URL

要创建 带有固定策略的 SigneDurl,你只需要调用 getSigneDurlwithcannedPolicy (),传入 cannedSignerRequ est 实例。 使用 SigneDurl 对象,您可以调用 url () 来返回签名的 网址字符串。

import software.amazon.awssdk.services.cloudfront.model.CannedSignerRequest;
import software.amazon.awssdk.services.cloudfront.url.SignedUrl;


SignedUrl signedUrl = cloudFrontUtilities.getSignedUrlWithCannedPolicy(cannedRequest);
// Returns a signed URL String that you can provide to users which will allow them to access your content
String url = signedUrl.url()

示例 #2:带有自定义策略的签名 Cookie

要创建 CookiesForCustomPolicy ,你只需要调用 getCookiesforCustomPol icy (),传入 customSignerRequest 实例 使用 CookieSforCustom Policy 对象,您可以调用相应的方法来返回策略、签名和密钥对 ID cookie 标头值,然后您可以将其 发送给查看者 以授予对您的私有内容的访问权限

import software.amazon.awssdk.services.cloudfront.cookie.CookiesForCustomPolicy;
import software.amazon.awssdk.services.cloudfront.model.CustomSignerRequest;


CookiesForCustomPolicy cookies = cloudFrontUtilities.getCookiesForCustomPolicy(customRequest);
// Generates Set-Cookie header values to send to the viewer to allow access
String signatureHeaderValue = cookies.signatureHeaderValue();
String keyPairIdHeaderValue = cookies.keyPairIdHeaderValue();
String policyHeaderValue = cookies.policyHeaderValue();

清理

您生成的 CloudFront 签名 URL/Cookie 将在指定的到期日期之前有效,在此之后,用户将无法访问您的私有内容。如果您希望在到期日期之前撤消访问权限,则只需要从 CloudFront 分配中删除可信签名人即可。

要完全拆除和清理所有资源,您必须先禁用 CloudFront 分配。然后,您可以在 CloudFront 中删除您的分配、密钥组和公钥。最后,您可以清空和删除 S3 存储桶。

结论

在这篇博客文章中,我们介绍了 CloudFront 签名 URL 和签名 Cookie 的基本功能。我们还展示了带有固定政策的签名网址和带有自定义策略的签名 Cookie 的代码示例。要了解有关如何设置和开始使用该功能的更多信息,请访问我们的 开发者指南 。如果你想知道它是如何实现的,可以查看 GitHub 上的 源代码 。与往常一样,我们欢迎在 aws-sdk-java- v2 GitHub 存储库上提交错误报告、功能请求和拉取请求。