[教學]在Ubuntu下使用certbot,替網站安裝Let’s Encrypt憑證,升級成更安全的HTTPS

現在由於安全性意識的普及,許多網站已經由過去的http,轉而使用更安全的https了。要使用https,首先得有一組憑證。但是…要弄到憑證可不是那麼簡單的,且在過往要拿到「被公認」的憑證,通常是要花錢的;自己做一個?是可以啦,但是得請瀏覽者在電腦中安裝這組憑證,蠻不便民的。

近年因為Google 等大企業開始推廣https,以及在Google Chrome瀏覽器將http標示為不安全等,帶動了https的需求。但是前面講到https需要一組憑證,所以便開始有組織提供免費的SSL憑證開放大家申請使用,讓網站可以使用更安全的https。

說到免費的SSL,我知道且有實際申請過的有SSL for free、Let’s Encrypt+certbot,以及Always on SSL三家。就實際使用經驗而言,我覺得Always on SSL的配置較難(憑證有拿到,但是在伺服器上安裝卻碰了一鼻子灰,最後失敗),SSL for free次之,Let’s Encrypt+certbot最容易上手。但就效期長短而言,Always on SSL長達一年,為三者當中最長的;另外兩者只有三個月。

SSL for free也是使用Let’s Encrypt的憑證,但缺點就是每次效期將屆滿時必須自行前往官網續期(會寄Email通知),然後換掉舊的憑證檔案。相對於此,Let’s Encrypt+certbot就真的方便許多了。只要會Linux指令,從申請、安裝、設定,乃至未來的更新,只要一個程式就可以幫你搞定了。

這篇文章主要就是介紹,如何使用certbot程式來替伺服器安裝SSL憑證。

示範平台

系統:Ubuntu 18.04.1 LTS
網頁伺服器:Apache 2.4
對外網址:michael19920129.ddns.net(No-IP的動態DNS)

操作流程

前置作業

首先當然是要把網站配置搞定,能夠使用http進入所架設的網站。我這裡是使用Apache,原因不外乎就是這是最多人使用的網頁伺服器,其二便是熟悉度較高。
這裡要留意的是網站設定檔(Ubuntu是存放在/etc/apache2/sites-available當中,sites-enabled是已經啟用的網站)當中,ServerName這個參數必須設定成網站所使用的網域名稱(也就是網址),因為接下來certbot在申請憑證時,會使用到這個參數的值。如果沒有設定正確,憑證也是可以申請到,但是在瀏覽是會出現憑證錯誤的問題,所以這一點不容忽視!
別忘了把ServerName參數設定正確!

設定certbot軟體庫(Ubuntu)

之後,就是在系統中加入certbot程式的軟體庫,以便後續進行certbot的安裝。
Ubuntu可使用官方的PPA,只要執行這段指令:sudo add-apt-repository ppa:certbot/certbot
(如果無法執行以上指令,請先執行這段指令:sudo apt-get install software-properties-common,之後就可以進行了)
Ubuntu自18.04開始,只要使用add-apt-repository指令加入軟體庫之後,就會自動更新軟體庫快取(也就是執行apt-get update指令)。如果你使用的是Ubuntu 17.10或更舊版本,請記得執行sudo apt-get update指令,否則接下來安裝certbot的指令一定會失敗
Debian的話,目前certbot已經被加入到官方的backports軟體庫了。在安裝之前記得先將backports軟體庫啟用,否則會無法安裝(別忘了要執行apt-get update)。

安裝certbot

接著就可以開始安裝certbot了。Ubuntu只要執行sudo apt-get install python-certbot-apache即可,其他所需要的軟體包(包括certbot程式本身)都會在這個時候自動幫你安裝妥當。
(使用nginx伺服器的使用者,請將上述指令最後的apache改成nginx)

Debian在啟用backports軟體庫且更新過快取後,執行sudo apt-get install python-certbot-apache -t stretch-backports。

(這段指令適用於Debian 9;如使用的是Debian 8,請將其中的stretch改成jessie。Debian我只試過Debian 9,且確定可以安裝使用;Debian 8沒有試過)

使用certbot安裝SSL憑證

最後就是執行certbot,為伺服器安裝SSL憑證。請執行這條指令:sudo certbot –apache(nginx使用者請將–apache改成–nginx)。
(debian要執行這段指令:sudo certbot –authenticator webroot –installer apache)
然後程式會問你一系列問題(當然是用英文):
  1. 詢問Email地址(在憑證快到期時通知)
  2. 是否要接收EFF電子報(選”no”,如果你要看就選”yes”吧)
  3. 接受使用條款
  4. 要申請的網域(它會讀取Apache的網站設定檔,只要有正確設定,顯示出來的應當是正確的網址):如果有多個網站,可選擇要申請的那一組或者全選
  5. 是否要設定自動導向:這裡有兩種方案可以選擇:
    1. 不設定:訪客可以選擇以http或https瀏覽網站,兩者各自獨立。
    2. 設定:不論訪客使用http或https網址瀏覽網站,都會自動導向到有https的網站。
到這裡,你的網站已經擁有一組SSL憑證了。你可以開啟所架設的網站網址,檢查看看是否有使用https。

使用certbot更新憑證

certbot預設會在憑證到期前一個禮拜自動進行更新,不需要使用者介入。但如果有需要的話,也是可以使用指令來進行憑證更新的。
一切只要執行這一段指令:sudo certbot renew
然後certbot就會自動幫你更新了;如果憑證效期還未接近期限,certbot是不會幫你更新的。
如果你想要看看certbot是怎麼更新憑證的,可以在以上指令最後面加入–dry-run;就會實際跑一遍給你看了。
執行結果如以下所示:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Processing /etc/letsencrypt/renewal/michael19920129.ddns.net.conf
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator apache, Installer apache
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for michael19920129.ddns.net
Waiting for verification…
Cleaning up challenges
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
new certificate deployed with reload of apache server; fullchain is
/etc/letsencrypt/live/michael19920129.ddns.net/fullchain.pem
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
** DRY RUN: simulating ‘certbot renew’ close to cert expiry
**          (The test certificates below have not been saved.)
Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/michael19920129.ddns.net/fullchain.pem (success)
** DRY RUN: simulating ‘certbot renew’ close to cert expiry
**          (The test certificates above have not been saved.)
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
IMPORTANT NOTES:
 – Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
以上是我使用sudo certbot renew –dry-run後所產生的訊息。

檢視目前的憑證資訊

既然certbot可以安裝、更新憑證,那麼檢視憑證應該也可以吧?當然可以!
執行這段指令:sudo certbot certificates,certbot就會把目前的憑證設定秀給你看了。
如果你要為其他的伺服器服務,例如FTP,設定SSL加密的話,可以套用其所顯示的憑證檔案位置,讓它們直接使用certbot的憑證。

總結

只要一個certbot指令,就可以進行憑證安裝、設定、更新,同時也可以設定好http導向,對於自行架設Linux伺服器和網站(或者使用Unix系統的虛擬主機)的玩家而言,不失為一個非常實用的工具。一條指令就幫你申請、安裝SSL憑證,還把導向設定好,這些功能在我用過的Always on SSL和SSL for free並不存在。certbot不只可以在Ubuntu下使用,Debian、CentOS、RHEL、FreeBSD,甚至macOS都可以使用certbot;但是certbot並沒有供Windows使用的官方應用程式,只能使用由其他志願者開發的第三方工具來實現certbot的功能,或者轉用另外兩家。
如果對certbot有興趣想多了解一些,且英文能力還可以的話,可以前往certbot的官方網站看看:https://certbot.eff.org/,介紹的肯定比這裡更詳細、更完備,當然也更可信。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料