适用于 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 存储库上提交错误报告、功能请求和拉取请求。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。