使用 Amazon CloudFront 签名 URL+S3 实现私有内容发布

阅读数:34 2019 年 11 月 15 日 08:00

使用Amazon CloudFront签名URL+S3实现私有内容发布

前言

Amazon CloudFront 是一个全球性内容分发网络 (CDN),可实现网站、API、视频内容或其他 Web 资产的快速分发。用户可以使用 CloudFront 来加速分发保存在 Amazon S3 存储桶上的各种内容,比如文档、图片、媒体文件和软件安装包等。很多 AWS 客户在使用 CloudFront+S3 通过互联网向自己的最终用户提供内容下载的时候,也希望能够限制到只允许合法的用户下载,比如那些已经通过了身份认证或已经付费的用户,避免开放下载可能造成的数据安全和流量成本等问题。进一步,这些 AWS 客户还希望能够限制其最终用户可以执行下载操作的日期时间段,发起下载请求的来源 IP 地址范围等等。使用 CloudFront 的签名 URL 功能就可以帮助 AWS 客户实现其私有内容的安全发布。

CloudFront 签名 URL 功能简介

CloudFront 的签名 URL 功能通过在普通的 Http 或 Https 请求中添加经过哈西和签名认证的策略内容,来保护私有内容不受非法访问。当收到来自客户端比如浏览器、移动 App 或桌面应用对特定资源的访问请求后,CloudFront 会首先利用保存的密钥解密请求中包含的签名部分内容,检查是否完整和正确。然后 CloudFront 继续分析解密出的权限策略内容,并根据权限策略定义的限制条件来决定是否向客户端提供请求资源。

AWS 客户可以开发 Web 服务或工具软件来向自己的最终用户提供签名 URL,就可以让这些最终用户在受限的条件下安全地访问通过 CloudFront 发布的内容,比如存储在 S3 中的图片。

AWS 客户除了可以在签名 URL 的权限策略定义中直接限制资源请求客户端可以访问的资源种类、请求发生时间、来源 IP 地址范围以外,结合 CloudFront 既有功能还可以进一步限制其发出请求的协议类型(Http 或 Https)、访问域名类型(CloudFront 自动分配域名或客户自有域名)。

整体技术方案

需求

在正式开始创建 CloudFront 私有内容发布之前,我们首先要明确在创建过程中的一些主要的选项。对于这些选项的不同设置会影响最终所创建的私有内容发布的效果。好在通过 CloudFront 发布私有内容的主要步骤基本类似,通过了解一个典型的 CloudFront 私有内容发布的完整过程就可以快速理解和掌握其他方式的发布过程。下面的表格列出了几个主要可选项和我们本次演示所做的选择。

col 1 col 2 col 3
选项 值域 本次选择
源站类型 S3 存储桶,

普通 Web 服务器 | S3 存储桶
客户端到 CloudFront 的协议类型 | Http,

Https | Https
CloudFront 到源站的协议类型 | Http,

Https | Https
CloudFront 发布点的类型 | Web 发布点,

RTMP 发布点 | Web 发布点
CloudFront 发布点的域名类型 | CloudFront 自动分配的域名,

客户自有域名 | 客户自有域名
签名类型 | 签名 URL,

签名 Cookie | 签名 URL
权限策略类型 | Canned Policy,

Custom Policy | Custom Policy

架构

一般地,一个完整的高性能私有内容发布平台主要包括四部分:内容源站,加速 CDN,身份认证和权限管理,资源请求客户端。基于上面的需求分析,我们可以明确本次介绍中的四部分组成:

  • 内容源站:S3 存储桶
  • 加速 CDN:CloudFront
  • 身份认证和权限管理:签名 URL 生成器

说明:这次功能演示并没有包括用户身份认证部分。这部分功能读者可以基于基本的签名 URL 生成器功能基础上继续添加。比如开发一个 Web 服务,在最终用户请求某个资源的时候先校验其身份,要求其先输入正确的用户名和密码,然后再为请求的具体资源自动产生签名 URL 并返回请求客户端。

  • 资源请求客户端:用户浏览器,移动 APP 或桌面客户端应用

使用Amazon CloudFront签名URL+S3实现私有内容发布
演示

当我们完成本次 CloudFront 签名 URL+S3 实现私有内容发布的相关设置和开发后,具体的演示过程如下:

  1. 向 S3 存储桶上传需要发布的内容,比如图片文件或视频文件。

  2. 利用签名 URL 生成器为上传的资源产生签名 URL

  3. 在测试机的浏览器中输入签名 URL 并发送请求给 CloudFront

  4. CloudFront 验证签名 URL

  5. 如果被请求资源已经在 CloudFront 当前边缘节点的缓存中,直接返回被请求资源。

  6. 如果被请求资源还不在 CloudFront 当前边缘节点的缓存中:

a) CloudFront 从 S3 存储桶取回被请求资源

b) CloudFront 将被请求资源返回浏览器

c) CloudFront 在当前边缘节点缓存该资源

使用 CloudFront 签名 URL+S3 实现私有内容发布的完整步骤

完整的步骤将分为以下几个主要部分分别执行:

(一) 创建 CloudFront 密钥对

(二) 创建 S3 存储桶

(三) 上传 SSL 安全证书

(四) 创建 CloudFront Web 发布点

(五) 更新 CloudFront Web 发布点,启用签名 URL 功能

(六) 开发签名 URL 生成器

(七) 验证测试

(一) 创建 CloudFront 密钥对

  1. 使用 AWS 根账号登录 Global AWS Web 控制台

  2. 访问“服务”→“安全、身份与合规”→“IAM”

  3. 查看“安全状态”,点开“删除您的根访问密钥”,执行“管理安全证书”

使用Amazon CloudFront签名URL+S3实现私有内容发布

  1. 访问“CloudFront 密钥对”,执行“创建新的密钥对”。

使用Amazon CloudFront签名URL+S3实现私有内容发布

  1. 下载创建的 CloudFront 密钥对对应的私钥文件,记录下密钥对的访问键值比如“BPMAJW4W4KMUGDSHRGWD”,这些内容在后面步骤开发签名 URL 生成器的时候都要用到。

f45c89a82b15:cert weimen$ ls *.pem

pk-APKAJW4W4KMUGDXXXXXX.pem

说明:产生和验证 CloudFront 签名 URL 需要用到信任的 AWS 账号所创建的 CloudFront 密钥对。这个信任的 AWS 账号既可以是创建 CloudFront 发布点的 IAM 用户所属的 AWS 账号 (Self),也可以是其他任何信任的 AWS 账号。

请注意:普通 IAM 账号无法创建 CloudFront 密钥对,必须是用根账号。

(二) 创建 S3 存储桶

  1. 使用具有完整 S3 操作权限的 IAM 用户登录 Global AWS Web 控制台

  2. 访问“服务”→“存储”→“S3”,执行“创建存储桶”。

  3. 在对话框中输入存储桶名称比如“cdntest0001”,选择区域,执行“创建”。

  4. 记录下创建的存储桶名称,在后面步骤创建 CloudFront Web 发布点的时候会用到。

  5. 传测试图片文件比如“earth.jpg”到新创建的 S3 存储桶中

使用Amazon CloudFront签名URL+S3实现私有内容发布

  1. 选中新建存储桶比如“cdntest0001”,点击“属性”标签,点开“权限”,可以看到这时候存储桶策略为空,ACL 设置只允许创建者访问。

(三) 上传 SSL 安全证书

  1. 如果尚未安装 AWS 命令行客户端(CLI), 请参照官方文档链接下载和安装 AWS CLI: http://docs.aws.amazon.com/zh_cn/cli/latest/userguide/installing.html

  2. 查找或新建一个 IAM 用户和对应 API 访问密钥(Access Key),需要保证该 IAM 用户拥有 IAM SSL 安全证书管理权限。

a) 关于如何创建 IAM 用户,请参见:

http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_users_create.html#id_users_create_console

b) 关于如何为 IAM 用户创建 API 访问密钥,请参见:

http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_credentials_access-keys.html

c) 关于如何为 IAM 用户设置权限策略,请参见:

http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/access_policies_create.html

http://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-iam-policy.html

  1. 执行“aws configure”,设置 IAM 用户 API 访问密钥和默认区域名,默认区域可以为任一海外区域。

f45c89a82b15:cert weimen$ aws configure

AWS Access Key ID [****************6ZXA]:

AWS Secret Access Key [****************NOLI]:

Default region name [us-east-1]:

Default output format [json]:

  1. 如果还没有 CA 签发的 SSL 安全证书,请提前完成申请,具体申请过程请参考相关 CA 的业务介绍说明。

  2. 使用相关工具查看 CA 签发的安全证书内容,确认该证书包含正确域名信息。

使用Amazon CloudFront签名URL+S3实现私有内容发布

  1. 列表 CA 提供的证书相关文件,确认安全证书文件、私钥文件和证书链文件都存在。

f45c89a82b15:cert weimen$ ls -l

total 24

-rwxr-xr-x@ 1 weimen ANT\Domain Users 2065 1 4 21:54 mw.homyusc.com.crt

-rwxr-xr-x@ 1 weimen ANT\Domain Users 1700 1 4 21:54 mw.homyusc.com.key

-rwxr-xr-x@ 1 weimen ANT\Domain Users 3449 1 4 21:54 root_bundle.crt

  1. 确认上面的文件内容都是 X.509 PEM 格式。如果不是,请使用对应工具先转化文件格式。下面的例子介绍了如何使用 openssl 将一个非 PEM 格式的.crt 文件转化为 PEM 格式。

openssl x509 -in mycert.crt -out mycert.pem -outform PEM

  1. 检查证书相关文件内容,确保格式正确

a) 安全证书文件 mw.homyusc.com.crt

-----BEGIN CERTIFICATE-----

MIIFxzCCBK+gAwIBAgIQMwrcYbUzB6y7QHQiyYQuwTANBgkqhkiG9w0BAQsFADCB

hTELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu

......

SkHCiJ3TLFqNNL7D/Lou5XuUVx9OdPneDrG3qXA2KDkFFSNIbI3TJKJ0icKOJyYj

hk6nE3hxn8S8PXJ670YaPozQRhT2ZW4hF10vpzZ5PY1cMZ+TCaKyTrlY0g==

-----END CERTIFICATE-----

b) 私钥文件 mw.homyusc.com.key

-----BEGIN RSA PRIVATE KEY-----

MIIEowIBAAKCAQEApeF7s/+BxjqPxri2DOhDla2XECfiJe02qG5TOLagm5e8niww

17ZmE6Ay5qR45Z8Tszkk1x3PPi0mSdkLeo24Nn9B1pwDpIIZZS3S5Pyiojz4Vu4J

......

ShsRa1MdKkWqHtWpu9HDPQwKqHhF6Z9d8MV+xGw7aieq63LfGGq0EmlMBWHRBpIQ

wV6SRCOf2YY1gHuftjmURyvNnoqntZtFfN2HHcO8QmfpRW2zpizZ

-----END RSA PRIVATE KEY-----

c) 证书链文件 root_bundle.crt

-----BEGIN CERTIFICATE-----

MIIEzjCCA7agAwIBAgIQJt3SK0bJxE1aaU05gH5yrTANBgkqhkiG9w0BAQsFADB+

MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5B

......

y+WutpPhI5+bP0b37o6hAFtmwx5oI4YPXXe6U635UvtwFcV16895rUl88nZirkQv

xV9RNCVBahIKX46uEMRDiTX97P8x5uweh+k6fClQRUGjFA==

-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----

MIIEtDCCA5ygAwIBAgIRAJOShUABZXFflH8oj+/JmygwDQYJKoZIhvcNAQELBQAw

PjELMAkGA1UEBhMCUEwxGzAZBgNVBAoTElVuaXpldG8gU3AuIHogby5vLjESMBAG

A1UEAxMJQ2VydHVtIENBMB4XDTA4MTAyMjEyMDczN1oXDTI3MDYxMDEwNDYzOVow

......

QVkppV4ig8OLWfqaova9ML9yHRyZhpzyhTwd9yaWLy75ArG1qVDoOPqbCl60BMDO

TjksygtbYvBNWFA0meaaLNKQ1wmB1sCqXs7+0vehukvZ1oaOGR+mBkdCcuBWCgAc

eLmNzJkEN0k=

-----END CERTIFICATE-----

  1. 上传 SSL 安全证书到 AWS IAM 服务

命令格式:aws iam upload-server-certificate –server-certificate-name [自定义的已上传证书名] –certificate-body [PEM 格式证书文件] –private-key [PEM 格式私钥文件] –certificate-chain [PEM 格式证书链文件] –path [访问路径]

f45c89a82b15:cert weimen$ aws iam upload-server-certificate --server-certificate-name MyTestCert

--certificate-body file://mw.homyusc.com.crt--private-key file://mw.homyusc.com.key

--certificate-chain file://root_bundle.crt --path /cloudfront/test/

{

"ServerCertificateMetadata": {

"ServerCertificateId": "ASCAIZCBMIGVKID653NV2",

"ServerCertificateName": "MyTestCert",

"Expiration": "2018-01-04T03:30:35Z",

"Path": "/cloudfront/test/",

"Arn": "arn:aws:iam::591809XXXXXX:server-certificate/cloudfront/test/MyTestCert",

"UploadDate": "2017-01-15T02:13:07.848Z"

}

}

请注意

  • 证书文件前面的“file://”不能省
  • –certificate-chain 不能省,如果没有值,就表示是用根证书。
  • –path 访问路径必须是以“/cloudfront/”开头,以“/”结尾。

(四) 创建 CloudFront WEB 发布点

  1. 使用具有完整 S3 和 CloudFront 操作权限的 IAM 用户登录 Global AWS Web 控制台

  2. 访问“服务”→“网络和内容分发”→“CloudFront”,执行“Create Distribution”。

  3. 选择创建 Web 发布点

  4. 请按照如下表格内容选择或输入内容:

col 1 col 2 col 3
字段名 输入值 说明
Origin Domain Name 刚刚创建的存储桶名,比如“cdntest0001” 通过下拉列表可选择
Restrict Bucket Access Yes 限制只能够通过 CloudFront 访问 S3 存储桶内容
Origin Access Identity Create a New Identity 如果您之前已经有创建的 OAI,可以选择“Use an Existing Identity”,并选中该 OAI,否则就让系统帮您创建一个。
Grant Read Permissions on Bucket Yes, Update Bucket Policy 自动更新 S3 存储桶策略, 添加 CloudFront OAI 用户对存储桶的读取权限。
Viewer Protocol Policy HTTPS Only 客户端只能够使用 Https 协议访问发布点
Alternate Domain Names 输入您的自有域名,比如“mw.homyusc.com” 该域名需要与上传的 SSL 安全证书中包含的域名信息一致。
SSL Certificate Custom SSL Certificate (example.com): 使用自己上传的 SSL 安全证书而不是默认的 CloudFront 安全证书。
Custom SSL Certificate (example.com): 选择之前上传到 IAM 服务的自有 SSL 安全证书
Custom SSL Client Support Only Clients that Support Server Name Indication (SNI) 部分不支持 SNI 的浏览器客户端将不能访问发布资源
Logging On
Bucket for Logs 选择 S3 存储桶 存放日志文件的 S3 存储桶
Log Prefix 输入 CloudFront 日志文件名前缀,比如“MyLog” 便于区分 CloudFront 日志文件和其他类型文件

使用Amazon CloudFront签名URL+S3实现私有内容发布

使用Amazon CloudFront签名URL+S3实现私有内容发布

使用Amazon CloudFront签名URL+S3实现私有内容发布

使用Amazon CloudFront签名URL+S3实现私有内容发布

  1. 其余设置都保留默认值

  2. 执行“Create Distribution”,记录下创建的 Web 发布点域名,形如“dz60cvvsxhzn8.cloudfront.net”。

  3. 访问“服务”→“存储”→“S3”,查看之前创建的存储桶已经发生了权限改变:

a) 存储桶 ACL 增加了“awsdatafeeds”账号的读写权限,目的是实现 cloudfront 日志文件上传。

b) 存储桶策略增加了 CloudFront OAI 用户账号的只读权限,实现 CloudFront 访问 S3 存储桶内容。

使用Amazon CloudFront签名URL+S3实现私有内容发布

  1. 刚刚创建完成的 Web 发布点将处于“In Progress”(正在部署)状态。

  2. 请耐心等待 Web 发布点最终变为“Deployed”(完成部署)状态。

使用Amazon CloudFront签名URL+S3实现私有内容发布

  1. 请访问您的自有域名的管理服务,创建或修改 cname 记录将自有域名比如“mw.homyusc.com”指向新创建的 Web 发布点 CloudFront 域名比如“dz60cvvsxhzn8.cloudfront.net”。

使用Amazon CloudFront签名URL+S3实现私有内容发布

  1. 检查自有域名的 cname 记录设置有效

f45c89a82b15:cert weimen$ dig mw.homyusc.com

; <<>> DiG 9.8.3-P1 <<>> mw.homyusc.com

;; global options: +cmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13861

;; flags: qr rd ra; QUERY: 1, ANSWER: 9, AUTHORITY: 4, ADDITIONAL: 4

;; QUESTION SECTION:

;mw.homyusc.com. IN A

;; ANSWER SECTION:

mw.homyusc.com. 19 IN CNAME dz60cvvsxhzn8.cloudfront.net.

dz60cvvsxhzn8.cloudfront.net. 60 IN A 52.84.26.216

  1. 在测试电脑的浏览器中输入未签名的访问 URL,使用 https 协议和自有域名,格式形如“ https://mw.homyusc.com/earth.jpg”

a) 浏览器就可以显示来自 S3 存储桶中的图片

使用Amazon CloudFront签名URL+S3实现私有内容发布

b) 浏览器中可以查看到之前上传的 SSL 安全证书

使用Amazon CloudFront签名URL+S3实现私有内容发布

说明:在这个阶段我们暂时还没有启用签名 URL 功能,只是设置了“自有域名”和 S3 存储桶“来源访问限制”功能。如果能够通过 Https 协议正常显示 S3 中的图片文件,说明前面的步骤设置正确无误。

(五) 更新 CloudFront WEB 发布点,启用签名 URL 功能

  1. 使用具有完整 CloudFront 操作权限的 IAM 用户登录 Global AWS Web 控制台

  2. 访问访问“服务”→“网络和内容分发”→“CloudFront”

  3. 选中之前创建的 Web 发布点,执行“Distribution Settings”

  4. 选中“Behavior”标签,编辑“Default (*)”。

  5. 设置“Restrict Viewer Access (Use Signed URLs or Signed Cookies)”为“Yes”

  6. 设置“Trusted Signers”为“Self”

说明:表示使用当前登录的 IAM 用户所对应的 AWS 账号来签名 URL 请求,“Trusted Signers”设置需要对应之前在创建的 CloudFront 密钥对时使用的 AWS 根账号。

使用Amazon CloudFront签名URL+S3实现私有内容发布

  1. 执行“Yes,Edit”按钮提交更新

  2. 刚刚更新完成的 Web 发布点将处于“In Progress”(正在部署)状态。

  3. 请耐心等待 Web 发布点最终变为“Deployed”(完成部署)状态。

(六) 开发签名 URL 生成器

CloudFront 支持使用各种开发语言和工具产生签名 URL。在这篇博客里,我提供了一个使用 JAVA 语言开发签名 URL 生成器的完整例子。整个项目包括源码和依赖的库文件都打包成了完整的 Eclipse 项目文件,用户只需要下载后执行 Eclipse 的项目导入操作就可以进行代码研究和测试。

JAVA 版的签名 URL 生成器主要依赖了一个第三方开源项目 jets3t 的相关库文件。jets3t 项目开发了一套完整的 JAVA 工具来访问 Amazon S3、Amazon CloudFront 和 Google Storage Service。 关于 jets3 项目的详情请参考其官网链接。

下面的步骤详细介绍了如何使用 jets3t 相关工具类来开发 CloudFront 签名 URL 生成器:

  1. 使用 openssl 转换下载的 PEM 格式 CloudFront 密钥对对应私钥文件成为 DER 格式

f45c89a82b15:cert weimen$ openssl pkcs8 -topk8 -nocrypt -in pk-APKAJW4W4KMUGDXXXXXX.pem -inform PEM -out cdnPK.der -outform DER

  1. 下面的代码片段展示了签名 URL 生成器的实现细节:

a) 读取 DER 格式的 CloudFront 密钥对的私钥文件

b) 构造被签名 URL

c) 构造定制访问权限策略

d) 执行签名

e) 输出签名后的 URL

public static void main(String[] args) throws Exception

{

//1. 加载 Hash 和签名算法类

Security.addProvider(

new org.bouncycastle.jce.provider.BouncyCastleProvider());

// ================================================================

// ================2. 签名相关参数 ====================================

// ================================================================

//2.1.CloudFront 为发布点分配的域名或者用户自己的域名

String param_DistributionDomain = " 自己的域名或 cloudfront 发布点的域名 ";

//String param_DistributionDomain = "mw.homyusc.com";

//2.2. 转化成 "*.der" 格式的私钥文件

String param_PrivateKeyFilePath = " 本地保存的 *.der 格式的 cloudfront 密钥对私钥文件的带路径文件名 ";

//String param_PrivateKeyFilePath = "/Users/weimen/signedurl/cert/cdnPK.der";

//2.3.S3 存储桶中文件的访问 Key 值

String param_S3ObjectKey = " 需要被访问的 S3 存储桶内文件访问 key 值 ";

//String param_S3ObjectKey = "earth.jpg";

//2.4.CloudFront 密钥对对应的访问 KEY 值

String param_KeyPairId = " 使用根账号创建的 CloudFront 密钥对 Key 值 ";

//String param_KeyPairId = "APKAJW4W4KMUGDXXXXXX";

//2.5. 待签名的 URL

// 具体协议 (http/https) 需要和 CloudFront 发布点设置对应

String param_UrlToBeSigned = "http:// 或者 https://"

+ param_DistributionDomain

+ "/"

+ param_S3ObjectKey;

/*

String param_UrlToBeSigned = "https://"

+ param_DistributionDomain

+ "/"

+ param_S3ObjectKey;

*/

//3. 加载私钥文件内容

byte[] derPrivateKey =

ServiceUtils.readInputStreamToBytes(

new FileInputStream(param_PrivateKeyFilePath));

// ================================================================

// ================4. 定制策略相关参数 ================================

// ================================================================

//4.1. 权限策略生效的路径,可以使用 "*" 和 "?" 来实现批量匹配,

// 具体协议 (http/https) 需要和 CloudFront 发布点设置对应

String param_PolicyResourcePath = "http:// 或者 https://"

+ param_DistributionDomain

+ "/"

+ param_S3ObjectKey;

/*

String param_PolicyResourcePath = "https://"

+ param_DistributionDomain

+ "/"

+ param_S3ObjectKey;

*/

//4.2. 签名 URL 失效时间

Date param_DateLessThan = ServiceUtils.parseIso8601Date("UTC 格式的签名 URL 失效时间 ");

//Date param_DateLessThan = ServiceUtils.parseIso8601Date("2017-06-30T22:20:00.000Z");

//4.3. 请求客户端的 Ip 地址范围 CIDR 设置(可选参数)

String param_limitToIpAddressCIDR = "CIDR 格式的请求源 IP 地址范围 ";

//String param_limitToIpAddressCIDR = "0.0.0.0/0";

//4.4. 签名 URL 生效时间(可选参数,不输入立即生效)

Date param_DateGreaterThan = ServiceUtils.parseIso8601Date("UTC 格式的签名 URL 生效时间 ");

//Date param_DateGreaterThan = ServiceUtils.parseIso8601Date("2017-01-01T06:31:56.000Z");

//5. 根据输入参数创建定制策略

String policy =

CloudFrontService.buildPolicyForSignedUrl(

param_PolicyResourcePath,

param_DateLessThan,

param_limitToIpAddressCIDR,

param_DateGreaterThan

);

System.out.println("[INFO]实际构造的的定制策略内容是【" + policy + "】");

//6. 执行实际签名操作(哈希+签名+Base64 编码)

String signedUrl =

CloudFrontService.signUrl(

param_UrlToBeSigned,

param_KeyPairId,

derPrivateKey,

policy

);

System.out.println("[INFO]输出的签名 URL 内容【" + signedUrl + "】");

}

  1. 读者通过研究上面的代码和注释就可以快速理解签名 URL 产生的大致流程,然后根据实际需要替换代码中的“签名相关参数”和“定制策略相关参数”(蓝色字体部分),就可以快速开发出属于自己的签名 URL 生成器。如果需要完整的代码例子,请直接下载对应的 Eclipse 项目文件。

  2. 例子代码产生的签名 URL 内容类似下面的例子:

https://mw.homyusc.com/earth.jpg?Policy=eyJTdGF0ZW1lbnQiOiBbey

JSZXNvdXJjZSI6Imh0dHBzOi8vbXcuaG9teXVzYy5jb20vZWFydGguanBnIiwiQ29uZGl0aW9uIjp7

IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNDk4ODYxMjAwfSwiSXBBZGRyZXNzIjp7IkFXU

zpTb3VyY2VJcCI6IjAuMC4wLjAvMCJ9LCJEYXRlR3JlYXRlclRoYW4iOnsiQVdTOkVwb2NoVGltZSI6MT

Q4MzI1MjMxNn19fV19&Signature=rJq1~uW3HZIVChPs5X5K9DnM2haH8oy488wXDAIJ6X6DBQAtVJAh

soHkPU3zaChCSGt9wG2uyuC-KslzhAw85K1b~EL52fOhuPf0uJOFAb5PUYW8R4BSyflE-

snFfzQs8laanuSmmpHNCDhGw3YrqPjFSBxm~03F5t2ElizLF~0nQdheZHLrnTrdPUMgHK6ffnANjnETul3aB4

JAzV8N1Wi5YtjjiTApiPQMJ8QrQaPScq9SonQbZdgqYuG5bzAdTxlW2gRwOfsftKSGNVK8uhczlParWZD8wa-

A5PWEaUznaBfHz1Arwiu~JnVGQTqhNPaAZs2BO95t4tqaVSrlWw__&Key-

Pair-Id=APKAJW4W4KMUGDXXXXXX

(七) 验证测试

  1. 当获得了经过签名的 URL 后,用户就可以在自己的浏览器中输入该签名 URL,或者将签名 URL 提供给自己开发的桌面客户端或移动 APP 来访问 S3 存储桶中的对应文件。

使用Amazon CloudFront签名URL+S3实现私有内容发布

  1. 用户还可以继续测试各种异常场景:

a) 直接使用 S3 文件的 URL 访问

b) 通过 CloudFront 域名而不是用户自有域名访问

c) 使用 Http 协议而不是 Https 协议访问

d) 在允许的时间段之外访问

e) 使用允许的源 IP 地址段之外访问

基于我们之前的设置,这些操作都将返回失败消息。

总结

这篇博客完整的介绍了如何利用 Amazon CloudFront 签名 URL 功能安全地发布存放在 S3 存储桶中的私有内容。读者通过研究和学习签名 URL 生成器的源码,演练完整的 CloudFront 私有内容发布创建步骤,就可以快速掌握 Amazon CloudFront 签名 URL 功能的正确配置和使用方法。

例子源码
https://s3.cn-north-1.amazonaws.com.cn/mwpublic/projects/signedurl/SignedURL.zip

参考链接

Amazon CloudFront 产品介绍

https://aws.amazon.com/cn/cloudfront/

Amazon S3 产品介绍

https://aws.amazon.com/cn/s3/

创建 CloudFront Web 发布点

http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/distribution-web.html

利用 CloudFront 发布私有内容

http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html

在 CloudFront 中使用 Https

http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/using-https.html

利用 Java 语言开发签名 URL

http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/CFPrivateDistJavaDevelopment.html

利用 C#和.Net 框架开发签名 URL

http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/CreateSignatureInCSharp.html

利用 PHP 开发签名 URL

http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/CreateURL_PHP.html

上传和管理 CloudFront 安全证书

http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/cnames-and-https-procedures.html

签名 URL 定制策略

http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html

jets3t 官网

http://www.jets3t.org/

作者介绍:

使用Amazon CloudFront签名URL+S3实现私有内容发布

蒙维

AWS 解决方案架构师,负责基于 AWS 的云计算方案架构咨询和设计,有超过十年以上电信行业和移动互联网行业复杂应用系统架构和设计经验, 主要擅长分布式和高可用软件系统架构设计,移动互联网应用解决方案设计,研发机构 DevOps 最佳实施过程。

本文转载自 AWS 技术博客。

原文链接:
https://amazonaws-china.com/cn/blogs/china/amazon-cloudfront-signature-url-s3/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布