问题描述
最近一个项目需要通过https的方式访问部署在S3上的网站,通过搜索引擎找到一篇文章,可以在AWS Global实现整个过程。但是目前AWS中国区有限制,CloudFront不能使用AWS Certificate Manager自己颁发的证书
解决思路
- 申请一个免费证书
- 导入到AWS IAM Certificate Store中
- 配置CloudFront使用整个证书
- Route53执行CloudFront
解决方案步骤
申请免费证书
https://letsencrypt.org/ 可以申请免费的短期证书(90天有效期),不需要公司证明等繁杂的手续,但需要证明这个域名是你的。
为了这个证书属于你,需要先让 http://your_domain_name 能够访问。
因为letsencrypt提供的certbot工具,支持自动配置nginx服务器,所以选择nginx作为网站服务器
在AWS中国区启动一台ubuntu 20.04的EC2
在配置EC2的security group的时候,确保80和443端口是开发的
在EC2上安装nginx
可根据这篇文章在ubuntu 20.04上安装配置nginx
确保执行以下命令,可以有html返回:
curl -i 127.0.0.1
回到AWS Console -> Route53,配置一条A记录,指向EC2,例如:
配置成功后,等DNS同步结束,就可以通过http方式访问你架设的nginx服务器了
安装certbot
certbot(letsencrypt官网指定的客户端)需要通过snap安装
sudo apt update
sudo apt install snapd
sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
certbot --version # check if installed successfully
(注:如果碰到snap安装慢的问题,可以考虑通过这篇文章提供的方式解决)
生成证书
可参考这篇文章,其实做到这步,你只需要执行一行命令即可:
sudo certbot --nginx # 按照向导提示选择正确的nginx网站
证书生成后,路径在这里: /etc/letsencrypt/live/{your_domain_name}/ 把该目录下的所有文件拷贝到本地主机的一个目录下,下一个步骤需要使用
(注:这个目录为隐藏目录,需要用sudo进行查看,可以用sudo cat ...命令查看每个文件内容并保存到本地)
sudo ls /etc/letsencrypt/live/{your_domain}/
sudo cat /etc/letsencrypt/live/{your_domain}/cert.pem
文件有: cert.pem chain.pem fullchain.pem privkey.pem
导入证书到IAM Certificate Store
参考这篇文章
aws iam upload-server-certificate --server-certificate-name SandboxSpaCertName --certificate-body file://cert.pem --private-key file://privkey.pem --certificate-chain file://chain.pem --path /cloudfront/sandbox/
配置CloudFront
回到AWS Console -> CloudFront, 创建一个distribution指向你的S3网站, 其中最关键的步骤是:使用Custom SSL Certificate:
1.替换成你的域名
2.选择Custom SSL Certificate
3.选择之前导入到IAM certificate store里面的证书
4.等待distribution部署完毕
配置Route53
回到AWS Console -> Route53: 创建一条cname指向CloudFront那条新创建的distribution
写在最后
这个问题,也许在AWS中国区后续的版本中能够解决。在这之前,如果你也遇到同样的问题,希望这篇文章可以帮到你。欢迎留言交流!