iT邦幫忙

1

Week18 - 用Let's Encrypt來為你的網站設定免費的SSL保護吧 - 實作篇 [Server的終局之戰系列]

本文章同時發佈於:


大家好,繼上篇Week17 - 用Let's Encrypt來為你的網站設定免費的SSL保護吧 - 概念篇之後,這次要來實作Let's Encrypt取得憑證的方式。

你需要準備

  1. 一台有Public IP的電腦。我採用AWS的EC2。
  2. 自己的URL,好像在講廢話XD,既然要拿憑證當然要先有網址啊。我採用Google Domain的。

整體流程

  1. 在電腦上啟動一個Server,並把他綁定在80 port。
  2. 在DNS上設定A資源紀錄,把URL指向此電腦的IP。
  3. 在電腦上運行Let's Encrypt官方提供的CertBot,他是一個驗證Client,會在此Server上放置驗證資料,再請Let's Encrypt的Server透過你的URL來取得此驗證資料,來證明這個URL真的是你所擁有。

安裝流程

我們總共需要安裝這些軟體:

  1. Node.js
  2. CertBot
  3. Git

那麼開始吧!以下都是用EC2的Amazon Linux 2 AMI (HVM),可能每個人電腦不一樣所以會有些許不同:

安裝Node.js

$ sudo curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
$ . ~/.nvm/nvm.sh
$ nvm install node

安裝CertBot

$ 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

安裝Git

$ 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>

會看到以下檔案

  • cert.pem: Let's Encrypt透過他們的中間憑證來幫你的Public key簽證的憑證
  • chain.pem: Let's Encrypt的中間憑證
  • fullchain.pem: cert.pem與chain.pem寫在一起的憑證
  • private.pem: 你憑證的私鑰

如果是第一次用憑證,你可能會跟我一樣有個疑惑,

我不就要一個憑證怎麼會給我中間憑證跟寫在一起的憑證?

chain.pemfullchain.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自動更新憑證。

謝謝你的閱讀,也歡迎分享討論指證~

參考資料


尚未有邦友留言

立即登入留言