如何在Ubuntu 16.04上安裝Certbot產生有效的SSL憑證

前言

在開始這篇文章之前,需要先確認已經完成下列兩篇文章:

  1. 如何在Ubuntu 16.04上的Nginx建立子網域
  2. 在Ubuntu 16.04 上架設Nginx + PHP 7

簡介Certbot

Certbot是一個由電子前哨基金會(EFF)所開發的工具,其目的是為了讓我們能夠輕易的安裝他們所推出的Let’s Encrypt憑證與續約。

那這個憑證,每次有效期只有三個月,因此續約憑證的有效性就顯的格外重要。以下是安裝的方法與步驟。

安裝Certbot

首先先進入他們所推出的官網

畫面會長下面這個樣子:

接著依照自己的作業系統與使用的HTTP server名稱選擇,以上述兩個教學文章來說,我們這邊要選擇的是,Ubuntu與Nginx,選完之後,會像下列的圖示那樣。

我們從上面的圖片可以看到,選好之後會有相對應的事情要我們做,依照它所寫的步驟,一步一步的將Certbot給安裝起來。依序的輸入下面的指令:


sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot

sudo apt-get update
sudo apt-get install python-certbot-nginx

安裝完成之後,我們可以選擇使用下面的指令,產生我們要SSL憑證之外,還需要幫我們設定Nginx相關的憑證設定。


sudo certbot --nginx

執行上述的指令之後,會跑出下面的畫面:

**注意**

如果在執行上述的指令發生下列類似錯誤訊息的話:


no module named pyasn1

有一些套件/模組並沒有安裝在系統中,因此我們需要使用下列的指令將我們缺少的套件給安裝起來。

要注意的是,在Ubuntu 16.04中,它會使用Python 3來安裝我們的


sudo apt-get install python3-pyasn1 python3-pyasn1-modules

安裝完成之後,再執行一次就會產生出這樣的畫面:

接著會開始一連串的問問題,像是:輸入你要顯示的e-mail還有一些條款需要同意等。

再來後面就是,有要同意就輸入『A』,或是要輸入是則輸入『Y』等,最後來到下面的畫面:

這邊是要問在它從網域清單裡面所找到的網域,請選擇要上HTTPS的憑證。

那這邊假使沒有出現你所建立好的子網域提供我們選擇的選項,沒有關係,我們在後面會有其他的作法可以指定網域上HTTP憑證。

這邊出現可以選擇網域的是:peter-lee.tk和www.peter-lee.tk

那假設上面所列出的清單都想上HTTPS憑證的話,就直接按下一enter鍵即可,那若要選擇,就選擇數字的1,2,3…..吧!我在這邊是選擇按下enter鍵。

在過程中,會有選項問說要不要設定重新導向到HTTPS的選項,這邊可以「No redirect」

我們後面的步驟中可以自行設定。重新導向問題如截圖:

完成之後,會產生下面的截圖,會出現所需要注意的Notes

接著我們輸入下面的網址來測試看看有沒有上好HTTPS憑證。


https://peter-lee.tk

那這樣就成功了。

強制從HTTP導向到HTTPS

有時候我們需要要求所有瀏覽網站的訪客都要使用HTTPS的方式進行連線,那我們就要讓訪客HTTP連線時,幫它重新導向到正確的位址。

我們可以在Nginx的設定檔中,加註這一行來達到這個目的。

我們先用vim編輯器打開Nginx設定檔。


sudo vim /etc/nginx/sites-available/default

在原來的設定檔裡面加上一些設定:


server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/html
    index index.php index.html
    
     if ($scheme = "http") {
         return 301 https://$server_name$request_uri;
     }

}

這個設定意思是說:當檢查$scheme是http時,就把整個網址導向成https連線方式,並給HTTP狀態碼為301。

接著存檔,並檢查Nginx語法是否有誤並重新啟動Nginx服務。


sudo nginx -t && sudo service nginx restart

接著瀏覽網站,就會發現會重新導向到HTTPS新的網站了。

利用Certbot指定網域

有時候,列出可以上SSL證書的子網域列表中,並沒有我們想要的,但是我們可以透過certbot所提供的指令來指定我們要上SSL證書的子網域。

不過記得要先把要上SSL證書的子網域先建立好。

指令如下:


certbot --nginx certonly -n -d sub.domain1.com

  • –nginx是指到哪一個HTTP server
  • certonly指的是只要產生憑證證書就好。
  • -n指的是不要有互動的選項(no interactive的意思)
  • -d指的是說指定要產生SSL憑證的網域名稱。

設定工作排程重新簽章憑證

因為Let’s encrypt SSL的證書也需要重新簽章憑證,所以要設定工作排程。

因為每三個月憑證證書就會失效,因此就需要使用工作排程來設定排程重新簽章。

進入排程編輯設定檔


sudo crontab -e

設定每三個月會重新簽章一次


0 0 3 * *    bash renew.sh

renew.sh


certbot --nginx certonly -n -d domain.com

簡易故障排除

在這章節,是我遇到的錯誤,因為我過了一段時間都還沒有把HTTPS的重新導向設定完成,一直吐「redirects are too many」的訊息給我….後來我找到問題了。

因為我把網域交給CLOUDFLARE代管,而DNS record會把proxy開起來,這意味著可以使用Cloudflare 外部forward的SSL連線,但是我們已經有安裝Let’s encrypt SSL了。

所以我們應該要將proxy forwarding 給關掉,如下示意圖,變成灰色就是代表關掉了。

下一篇文章,將會介紹PostgreSQL的使用方式,不要錯過了喔!

參考資料

  1. Nginx 301 重定向 redirect 域名配置
  2. Certbot