問題描述
最近一個項目需要通過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中國區后續的版本中能夠解決。在這之前,如果你也遇到同樣的問題,希望這篇文章可以幫到你。歡迎留言交流!