【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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

  • 2019-11-15
  • 本文字数:15866 字

    阅读完需:约 52 分钟

使用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 1col 2col 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 或桌面客户端应用



演示


当我们完成本次 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. 查看“安全状态”,点开“删除您的根访问密钥”,执行“管理安全证书”



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



  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 存储桶中



  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 签发的安全证书内容,确认该证书包含正确域名信息。



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






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

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

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


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


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



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

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



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



  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 存储桶中的图片



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



说明:在这个阶段我们暂时还没有启用签名 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 根账号。



  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 存储桶中的对应文件。



  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/


作者介绍:



蒙维


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


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/amazon-cloudfront-signature-url-s3/


2019-11-15 08:001289

评论

发布
暂无评论
发现更多内容

Java jdk下载安装与配置及其不同版本jdk切换,Java开发实战

JVM调优资料

Java 程序员 后端

Java中的注解到底是怎么一回事?,jvm原理面试题

Java 程序员 后端

网络攻防学习笔记 Day123

穿过生命散发芬芳

9月日更 互联网安全 流量采集

Linux之lastb命令

入门小站

Linux

在线JSON转Mongoose工具

入门小站

工具

Go 专栏|开发环境搭建以及开发工具 VS Code 配置

AlwaysBeta

Go 语言

LeetCode刷题13-简单-罗马数字转整数

ベ布小禅

9月日更

epoll底层实现源码及epoll反应堆模型

hanaper

java web 部分,Java教学视频百度云盘

Java 程序员 后端

粗放生长时代结束,高精地图收紧灰色地带

脑极体

LeetCode题解:143. 重排链表,数组,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

linux网络包收发讲解

赖猫

Linux

JDK 8 及其后续 JDK 中 Period 和 Duration

HoneyMoose

C语言:十进制、BCD码互换

不脱发的程序猿

C语言 十进制、BCD码互换

我们为什么要学习TypeScript ?

法医

typescript

Java-进阶:多线程1,Java程序员必须掌握的技术

Java 程序员 后端

Java中高级核心知识全面解析,Java工程师需要掌握的技能

Java 程序员 后端

架构实战训练营|作业|模块2

Frode

#架构实战营

找啊找啊找工长,找到一个好工长

escray

生活记录 9月日更

【LeetCode】所有奇数长度子数组的和Java题解

Albert

算法 LeetCode 9月日更

08. 语音识别与第二次AI热潮

数据与智能

人工智能

JavaScript数组常用的方法总结

孙叫兽

JavaScript 大前端 数组 引航计划

前端开发css这些样式你还熟悉吗,Chrome是必备技能

你好bk

CSS html css3 大前端

IntelliJ IDEA 如何快速查看提交代码的对比

HoneyMoose

java web 部分(1),Java技术总监面试常见问题及答案

Java 程序员 后端

Java中高级核心知识全面解析,Java大厂高级面试题灵魂100问

Java 程序员 后端

C语言:十进制、十六进制数据互换

不脱发的程序猿

C'语言 进制转换

HTTP系列之:HTTP缓存

程序那些事

缓存 Netty HTTP 程序那些事

Excelize 开源五周年 🎉

xuri

Excel Excel数据分析 Go 语言 Excelize

架构实战营模块七作业

老猎人

架构实战营

Java全面学习视频书籍,阿里架构师看到都觉得好,Java自学教程

Java 程序员 后端

使用Amazon CloudFront签名URL+S3实现私有内容发布_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章