曲线救国-用cloudfront为S3自定义域名静态托管加上https加密

作者:光环云 田亮

S3静态托管

S3服务(Simple Storage 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 访问。

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访问成功:曲线救国-用cloudfront为S3自定义域名静态托管加上https加密_第1张图片

直接https://image.52aws.cn/rocket.jpg访问失败:曲线救国-用cloudfront为S3自定义域名静态托管加上https加密_第2张图片

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

转机

正在准备放弃时,突然想起最近的一个新闻,CloudFront服务在国内上线了!灵机一动,CloudFront支持配置SSL证书及自定义域名,也可以指定S3Bucket为后端源站,通过CloudFront将Bucket以Https的形式发布出去应该就可以了!且CloudFront的流量费只有S3的三分之一,用户访问资源的延迟更低;一举三得,何乐而不为呢?经过一番折腾最终成功,具体过程如下:

1、 准备证书

想使用HTTPS首先要准备好证书, global有ACM(AWS Certificate Manager)服务可以直接在AWS申请免费证书,国内需要自己申请然后上传到IAM,两种操作方式分别如下:

1.1 AWS Global区

如果使用的Global服务可以直接用ACM(AWS Certificate Manager)服务免费申请,但要注意一定一定要在美东1弗吉尼亚北部申请,否则后面CloudFront无法看到相应的证书(笔者在这卡了很久,我一般习惯使用俄勒冈进行试验,顺手就在俄勒冈的ACM服务上申请了证书,可是在后面无论如何都刷不出,最后才看有提示必须创建在弗吉尼亚北部)。申请过程非常简单,本文就不详细展开了,以后有机会单开一文给大家进行介绍。
笔者在ACM上申请的证书:
曲线救国-用cloudfront为S3自定义域名静态托管加上https加密_第4张图片

1.2AWS中国区

中国区没有ACM服务,因此需要自行准备证书并上传到IAM上。大家可以购买商业证书,由于是演示环境,笔者用https://github.com/Neilpang/acme.sh项目在https://letsencrypt.org/申请的免费证书就够用了,免费证书有效期为90天,申请方式可参考文章https://zhuanlan.zhihu.com/p/49444696。
证书由三个文件组成:签好名的证书、证书私钥、证书链。上传前需要先为IAM用户赋予上传证书的权限,否则后面上传证书会报权限错误。赋权过程如下:
创建允许上传证书的策略
IAM–>策略–> 创建策略
Json 输入以下内容

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "iam:UploadServerCertificate",
            "Resource": "arn:aws-cn:iam::*:server-certificate/*"
        }
    ]
}

输入策略json文本:
曲线救国-用cloudfront为S3自定义域名静态托管加上https加密_第5张图片
填入策略名称和描述,保存:
曲线救国-用cloudfront为S3自定义域名静态托管加上https加密_第6张图片
将策略附加给所使用的IAM用户,本文以Tianliang为例。
IAM—用户—添加权限
按图中内容,选择刚刚创建的策略并添加:
曲线救国-用cloudfront为S3自定义域名静态托管加上https加密_第7张图片至此该用户已具有上传权限,先不着急上传证书,我们在创建分配的过程中再上传。
接下来开始cloudfront配置
创建分配,
进入cloudfront服务,点击创建分配。
Global支持RTMP和Web,选择web,中国区现在只支持web。
在接下来的界面源域名中选择对应的bucket,查看器协议策略选择将HTTP重定向到HTTPS,将需要使用的自定义域名填入备用域名框并上传SSL证书。
源域名选择相应bucket:
曲线救国-用cloudfront为S3自定义域名静态托管加上https加密_第8张图片
备用域名中填入需要使用的自定义域名,点击上传证书至IAM:
曲线救国-用cloudfront为S3自定义域名静态托管加上https加密_第9张图片
按顺序填入之前申请到的证书内容并上传:
曲线救国-用cloudfront为S3自定义域名静态托管加上https加密_第10张图片
如果是和我一样在letsencrypt.org申请的免费证书私有密钥为扩展名为.key的文件,证书正文为.cer的文件,证书链为fullchain.cer;如果是其他证书提供商请根据证书提供商的说明填写,AWS只支持pem格式的证书,若格式不符请自行转换。
Global若已经在ACM申请好证书,可以直接在下拉菜单中选择分配好的证书,如果托管的是网站,可以在默认根对象的位置填入 index.html,否则保持默认,点击分配。点击完成后cloudfront开始进行部署。

开始部署:
曲线救国-用cloudfront为S3自定义域名静态托管加上https加密_第11张图片
等待时间比较漫长,我们可以先去配置CNAME指向,我用的是Route53,可以直接做别名,使用其他域名解析服务的同学将自定义域名cname到红圈位置所示的cloudfront域名即可。
曲线救国-用cloudfront为S3自定义域名静态托管加上https加密_第12张图片
部署完成,我们可以看到已经可以使用https访问相应资源了!
曲线救国-用cloudfront为S3自定义域名静态托管加上https加密_第13张图片



在这里插入图片描述

你可能感兴趣的:(存储)