写点什么

使用 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:001485

评论

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

给弟弟的信第2封|关于时间管理这件事

大菠萝

28天写作

浅谈Linux进程模型

lecury

Linux 进程 经验

自定义 View:绘制垂直正弦函数

Changing Lin

12月日更

纯css实现117个Loading效果(下)

德育处主任

css3 大前端 纯CSS css特效

音视频实战(1)- 音频质量关键指标之QoE

liuzhen007

签约计划第二季

Git进阶(七): 打标签

No Silver Bullet

git 学习 12月日更

浅谈Linux虚拟文件系统

lecury

Linux 文件系统 经验分享、

操作系统:Linux下的防火墙

程序员架构进阶

Linux 操作系统 防火墙 Firewalld 12月日更

JVM 性能诊断工具

Ayue、

JVM 技术专题合集

音视频学习合集

Fenngton

内容合集 签约计划第二季

「架构实战营」模块一作业

Vincent

「架构实战营」

MySQL探秘(四):InnoDB的磁盘文件及落盘机制

程序员历小冰

MySQL 文件读写 28天写作 12月日更

25个带有酷炫动画的创意404错误页面,快给你的网站换上吧(持续更新)

海拥(haiyong.site)

大前端 28天写作 404 签约计划第二季 12月日更

浅谈Linux线程模型

lecury

Linux 线程 经验分享、

浅谈Linux内存管理

lecury

Linux 内存管理 经验分享、

浅谈Linux Cgroups机制

lecury

Linux Cgroups 经验分享、

面试官说:你来设计一个短链接生成系统吧

秦怀杂货店

Java 系统架构 系统 短链接

程序员写作模版献给懵逼的你

jerry

升级【爸爸程序员】了?用Python给自己的宝贝下载200+绘本动画吧!

梦想橡皮擦

12月日更

如何在 ASP.NET Core 中重写 URL

喵叔

28天写作 12月日更

了解 JVM 的方法调用

Ayue、

JVM 技术专题合集

Arthas阿里开源的Java诊断工具

Ayue、

JVM 技术专题合集

域控安全之域渗透

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 漏洞挖掘

Linux内核技术分享

lecury

内容合集 签约计划第二季

【Redis集群原理专题】分析一下相关的Redis集群模式下的脑裂问题!

洛神灬殇

redis 分布式系统脑裂 集群 脑裂 12月日更

JVM性能调优之内存优化与GC优化实战

Ayue、

JVM jvm调优 技术专题合集

全方位认识 JVM

Ayue、

内容合集 技术专题合集

乔布斯家app下架上架杂记

张老蔫

28天写作

流处理引擎Flink:编程 - 程序结构

正向成长

Flink 实践教程-入门(9):Jar 作业开发

腾讯云大数据

flink 流计算 Oceanus

眼耳鼻舌身意,严肃地聊一聊元宇宙的“技术拼图”

脑极体

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