本文章同時發佈於:
大家好,繼上篇Week17 - 用Let's Encrypt來為你的網站設定免費的SSL保護吧 - 概念篇之後,這次要來實作Let's Encrypt取得憑證的方式。
我們總共需要安裝這些軟體:
那麼開始吧!以下都是用EC2的Amazon Linux 2 AMI (HVM)
,可能每個人電腦不一樣所以會有些許不同:
$ sudo curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
$ . ~/.nvm/nvm.sh
$ nvm install node
$ curl -O http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ sudo yum install epel-release-latest-7.noarch.rpm
$ sudo yum install certbot
$ sudo certbot
$ sudo yum update -y
$ sudo yum install git -y
安裝好了所有軟體之後,就可以開始驗證了,以下也都是用EC2來完成的,每個電腦可能會有些許差異:
去DNS網站上把URL透過A資源紀錄指到此電腦的IP
Clone我寫好的Server,
$ git clone https://github.com/superj80820/w3school-40-weeks.git
將80 port導到8080 port,這邊是EC2的特性,由於EC2禁止1024以下的port被使用,所以我必須把80 port透過8080 port代理
$ sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
啟動Server
$ cd w3school-40-weeks/week18
$ npm install
$ node verify.js
我們可以看看Server的code,其實也沒什麼大不了的,就是設定了一個static
資料夾可以供CertBot來放入驗證資料。
const express = require('express')
const app = express()
app.use(express.static('static'))
app.listen('8080', () => console.log('Server run on port 8080'))
啟動CertBot來驗證
sudo certbot certonly --webroot -w ./static -d <你的domain>
-w
即是指要放驗證資料的資料夾,-d
即是放你的domain,以我來說我剛剛的設定我就要這樣下指令
sudo certbot certonly --webroot -w ./static -d api.messfar.com
接下來CertBot會問你一些同意事項與請你輸入Email,我這邊輸入完Email之後都一路確認與同意。然後就成功了,簡單吧!
我們可以來看看CertBot幫我們取得的憑證
sudo ls /etc/letsencrypt/live/<你的domain>
會看到以下檔案
如果是第一次用憑證,你可能會跟我一樣有個疑惑,
我不就要一個憑證怎麼會給我中間憑證跟寫在一起的憑證?
chain.pem
與fullchain.pem
會發給你最大的點就是,
為了相容性
我們的電腦中都有各個有名的CA廠商的憑證,詳細可以看我的憑證介紹文章,剛剛我們有提到cert.pem
是透過Let's Encrypt的中間憑證來簽證的,如果電腦上找不到此中間憑證就會無法驗證cert.pem
的憑證真實性,所以會由在Server上以chain.pem
來提供,以增加相容性。
你可能還會有個疑問,
電腦怎麼知道Server上的
chain.pem
是Let's Encrypt的?
在電腦上的CA憑證有可能會沒有一些中間憑證,但根憑證一定擁有,所以會用根憑證去驗證此中間憑證是不是真實的。
至於為什麼根憑證一定擁有,主要是因為那都是CA廠商簽出來可能十到二十年的長時間憑證,他不像中間憑證會那麼常替換,
所以就會顯示以下的憑證鍊:
而在以前的時代,你的憑證跟中間憑證其實要分開放才行,但後來為了方便就可以兩個憑證放一起了,所以就有fullchain.pem
這個檔案,你可以把自己的憑證複製起來並且拿去fullchain.pem
比對,就會發現第一個憑證即是你的憑證。
複製憑證至Server資料夾,來啟動HTTPS Server試看看,EC2一樣需要代理,我這邊將443 port代理至8090 port
$ sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8090
& sudo ./copyCert.sh <你的domain>
& node https.js
可以囉,太棒了~
實作了索取憑證後,接下來在AWS EC2上的Load Balancer自動更新憑證。
謝謝你的閱讀,也歡迎分享討論指證~