提问

#楼主# 2019-7-16

跳转到指定楼层
作者:光环云 田亮

S3静态托管
S3服务(SimpleStorage Service)是一项业内领先的对象存储服务,很多AWS用户在构建应用系统时会将静态资源如图片、音视频、CSS样式文件、静态文件等存储到S3上供公共用户访问或页面嵌入;另外S3还支持静态网站托管,用户可以使用自有域名而非S3域名访问存储在S3服务上的资源,如笔者的S3桶中的资源经过配置开启静态网站托管后既可以使用 S3域名http://s3-us-west-2.amazonaws.com/image.52aws.cn/rocket.jpg访问也可以使用自有域名http://image.52aws.cn/rocket.jpg访问(如何配置S3静态网站托管请参考笔者另外一篇文章《如何用自有域名在S3上托管静态网站》)。

HTTPS加密
随着大家对安全的重视,越来越多的业务场景要求必须使用HTTPS协议(比如苹果APP、微信小程序等),全站HTTPS加密已经成为一种趋势,S3服务很早之前就已经支持通过HTTPS的方式访问云中资源,如上面搭建的演示站点就可以通过https://s3-us-west-2.amazonaws.com/image.52aws.cn/rocket.jpg进行访问,但如果尝试过就会发现,使用https://image.52aws.cn/rocket.jpg访问失败,如图:


图:https://s3-us-west-2.amazonaws.com/image.52aws.cn/rocket.jpg访问成功



图:直接https://image.52aws.cn/rocket.jpg访问失败


检查一遍发现原来S3使用的证书是颁发给*.s3-us-west-2.amazonaws.com的(笔者使用美西2俄勒冈),显然使用image.52aws.cn这样的自定义域名无法访问,在S3控制台找了一圈也没发现可以关联证书的功能,仔细看了一遍S3的用户手册也没有发现类似的说明,事情似乎陷入了僵局,看上去好像无解了。

图:S3采用的证书


转机
正在准备放弃时,突然想起最近的一个新闻,CloudFront服务在国内上线了!灵机一动,CloudFront支持配置SSL证书及自定义域名,也可以指定S3Bucket为后端源站,通过CloudFront将Bucket以Https的形式发布出去应该就可以了!且CloudFront的流量费只有S3的三分之一,用户访问资源的延迟更低;一举三得,何乐而不为呢?经过一番折腾最终成功,具体过程如下:1、 准备证书想使用HTTPS首先要准备好证书,global有ACM(AWSCertificate Manager)服务可以直接在AWS申请免费证书,国内需要自己申请然后上传到IAM,两种操作方式分别如下:1.1 AWS Global区,如果使用的Global服务可以直接用ACM(AWS Certificate Manager)服务免费申请,但要注意一定一定要在美东1弗吉尼亚北部申请,否则后面CloudFront无法看到相应的证书(笔者在这卡了很久,我一般习惯使用俄勒冈进行试验,顺手就在俄勒冈的ACM服务上申请了证书,可是在后面无论如何都刷不出,最后才看有提示必须创建在弗吉尼亚北部)。申请过程非常简单,本文就不详细展开了,以后有机会单开一文给大家进行介绍。
图:笔者在ACM上申请的证书

1.2AWS中国区中国区没有ACM服务,因此需要自行准备证书并上传到IAM上。大家可以购买商业证书,由于是演示环境,笔者用https://github.com/Neilpang/acme.sh项目在https://letsencrypt.org/申请的免费证书就够用了,免费证书有效期为90天,申请方式可参考文章https://zhuanlan.zhihu.com/p/49444696。证书由三个文件组成:签好名的证书、证书私钥、证书链。上传前需要先为IAM用户赋予上传证书的权限,否则后面上传证书会报权限错误。赋权过程如下:创建允许上传证书的策略IAM-->策略--> 创建策略  Json 输入以下内容:
  1. {
  2.     "Version": "2012-10-17",
  3.     "Statement": [
  4.         {
  5.             "Sid": "VisualEditor0",
  6.             "Effect": "Allow",
  7.             "Action": "iam:UploadServerCertificate",
  8.             "Resource": "arn:aws-cn:iam::*:server-certificate/*"
  9.         }
  10.     ]
  11. }
复制代码

图:输入策略json文本

图:填入策略名称和描述,保存

将策略附加给所使用的IAM用户,本文以Tianliang为例。
IAM—用户—添加权限

按图中内容,选择刚刚创建的策略并添加

至此该用户已具有上传权限,先不着急上传证书,我们在创建分配的过程中再上传。
接下来开始cloudfront配置
创建分配,进入cloudfront服务,点击创建分配。
Global支持RTMP和Web,选择web,中国区现在只支持web。在接下来的界面源域名中选择对应的bucket,查看器协议策略选择将HTTP重定向到HTTPS,将需要使用的自定义域名填入备用域名框并上传SSL证书。

源域名选择相应bucket

备用域名中填入需要使用的自定义域名,点击上传证书至IAM

按顺序填入之前申请到的证书内容并上传

如果是和我一样在letsencrypt.org申请的免费证书私有密钥为扩展名为.key的文件,证书正文为.cer的文件,证书链为fullchain.cer;如果是其他证书提供商请根据证书提供商的说明填写,AWS只支持pem格式的证书,若格式不符请自行转换。Global若已经在ACM申请好证书,可以直接在下拉菜单中选择分配好的证书,如果托管的是网站,可以在默认根对象的位置填入 index.html,否则保持默认,点击分配。点击完成后cloudfront开始进行部署。
开始部署
等待时间比较漫长,我们可以先去配置CNAME指向,我用的是Route53,可以直接做别名,使用其他域名解析服务的同学将自定义域名cname到红圈位置所示的cloudfront域名即可。

部署完成,我们可以看到已经可以使用https访问相应资源了!





转播转播
回复

使用道具

成为第一个回答人

B Color Link Quote Code Smilies
光环云社区 |京ICP备18044167号-13|

京公网安备 11010102003758号