Morris's blog

部落格建置過程5 - 透過Let'sEncrypt公司取得免費的SSL證書,製作HTTPS連線

2018-08-22
文章標籤: Let's Encrypt, https, Certbot,

HTTP"S", "S" means secured

  • 每當瀏覽器連上一個網站後進行一次又一次的HTTP請求與接收回應,就是一次又一次的資料交換,這些過程的資料應該要被加密,以防止有心人士在網路傳輸過程之間攔截資料,進而修改或是竊取資料。
  • HTTPS就是HTTP通訊協定的"加密版",透過一些瀏覽器與伺服器之間的密鑰交換來加密資料與解密資料。

以前要將網站連線升級成HTTPS的話...

  • 在以前,人們覺得將網站設置HTTPS是一件花費不斐又辛苦的事,因為必須要固定每隔一段時間就要續約HTTPS的憑證,又要每隔一段時間就要更新,一般的個人網站或是一些小企業的網站大部分的維護人員都不多,實在很難有心力跟財力持續做這些事情。
  • 但是這件事就在一個偉大的組織的成立之後有所改變。

Let's Encrypt

Let's Encrypt是一個於2015年三季度推出的數位憑證認證機構,  
旨在以自動化流程消除手動建立和安裝憑證的複雜流程,  
並推廣使全球資訊網伺服器的加密連接無所不在,為安全網站提供免費的SSL/TLS憑證。...

以上取自Let's Encrypt的維基百科頁面

  • Let's Encrypt推行著HTTPS every where,讓大家上網都是加密連接的,保護你我的資料的安全,不讓邪惡的中間人能夠解讀我們傳輸中的資料。
  • Let's Encrypt推出一個叫Certbot的軟體,幫助人們能夠將其網站自動向Let's Encrypt申請憑證與安裝憑證在server上,並能夠有自動更新憑證的功能。
  • 這個Certbot軟體,一開始就是針對Linux環境的Server推出的,所以在我們的Digital Ocean的Linux VPS主機可以適用。

先前準備工作

  1. 本安裝過程假設使用者的OS是CentOS 7,並且已經設定好一個可以用sudo指令取得root權限的使用者。
  2. 必須要有一個自己擁有的網域名稱(就是上一篇文章在教的事情)。
  3. 這個網域名稱已經設定好A指向到你的VPS主機(也是上一篇文章在教的事情)。
  4. 最好按照先前的文章的事情都已經做過了,像是安裝好Nginx。因為我們的HTTPS機制會建構在Nginx上。 如果以上這些條件都滿足的話,那就已經準備好,可以來為VPS主機上的服務來建立HTTPS連線了。

安裝Certbot

  • Certbot可以說是我們的VPS主機與Let's Encrypt之間聯繫的client端程式,我們必須要透過這個程式來下載憑證。
  • 所以就先來安裝Centbot這個程式,在目前最安全的方式是透過EPEL來安裝,所以我們先允許我們的主機能從EPEL上下載程式:

    sudo yum install epel-release
  • 接著就可以下載針對Nginx的Cenrbot - certbot-nginx

    sudo yum install certbot-nginx

    這樣子,Certbot就安裝好了。

確定有設定好Nginx,並且目前是在背景常駐中

  • 可以按照先前的這篇文章來做基本的設定。按照文章中來做,也會將防火牆的HTTP跟HTTPS的預設port有設定成允許存取。

再設定一下Nginx的設定檔裡的Server區塊

  • 按照上次的設定的話,我們目前自己對Nginx的設定是寫在/etc/nginx/conf.d/default.conf這個設定檔裡, 用文字編輯器打開它,

    sudo vim /etc/nginx/conf.d/default.conf

找到server區塊,在server_name屬性裡填入上一篇文章中申請好的Domain,在這裡我們先假設我們申請的domain叫example.com,有www,跟沒有www的都要加上,空白隔開。

 server{

    listen       80;
    server_name  example.com www.example.com;  #增加的部分

   ### .....以下省略
 }

改完後存檔離開。

:x

再用這個指令檢查設定檔是否都正確無誤

sudo nginx -t

再讓Nginx重新讀取設定檔

sudo systemctl reload nginx

執行Certbot來取得憑證

  • 在這邊一樣要填入之前申請好的Domain:

    sudo certbot --nginx -d example.com -d www.example.com

    --nginx 代表是要使用Certbot的nginx plugin,因為我們在安裝Certbot的時候就是安裝Nginx版的了,所以會有這個plugin跟參數可以使用。
    -d 代表指定domain,這邊-d我們用了兩次,因為我們希望來連我們的網站的人,不管網址有沒有打www都會是HTTPS連線。
    這個指令下完之後,如果這是你第一次執行Certbot,它會先要求你輸入你的e-mail,並接受它們的服務條款。接著Certbot程式就會執行,去跟Let's encrypt連線,並檢查你提供的Domain是不是真的是你的(跟上一篇文章裡A指向,dname,GoDaddy那邊有沒有設定好有關),然後幫你申請這個網域的憑證。

  • 如果這些事都成功的話,Certbot會再問你要不要把所有連線都改成強制用HTTPS連線,就選2然後按下Enter吧,強制要連上我們的網站一定要建立HTTPS連線。選擇1或2,這會關係到Certbot怎麼樣去調整你的Nginx的設定檔。
  • 這時候Certbot就會帶出一段訊息,告訴你這流程已經成功,並且它把憑證存到哪裡。
  • 這樣子初步的HTTPS設定就設定完成了。這時候使用https://...you_domain應該就能成功連上你的網站,並且瀏覽器上的網誌列左邊會顯示加密連線的標誌。

更新 迪菲-赫爾曼(Diffie-Hellman) 參數

  • 如果你現在使用SSLLabs這個網站,輸入你的網址,它會去測試你的網站的HTTPS連線的安全性強度,你會發現你只能拿到B等級的分數,這是為什麼?

原因就是你的迪菲-赫爾曼(Diffie-Hellman) 參數的強度太弱了。

迪菲-赫爾曼密鑰交換(英語:Diffie–Hellman key exchange,縮寫為D-H) 是一種安全協定。
它可以讓雙方在完全沒有對方任何預先資訊的條件下通過不安全信道建立起一個金鑰。
這個金鑰可以在後續的通訊中作為對稱金鑰來加密通訊內容......

以上內容取自 維基百科 - 迪菲-赫爾曼密鑰交換

  • 這個參數的強度會影響到Server跟client初次建立連線時密鑰交換時的安全性,我們可以重新在我們的VPS上計算一個強度更強的參數,存在一個dhparam.pem檔裡,然後在我們的Nginx的設定檔的Server區塊裡使用它。

  • 透過openssl這個OS自帶的程式來產生這個檔案

    sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

    2048這個數字代表著計算的複雜程度,數字越大強度越強,算出來的時間也要花得越久。

  • 計算完之後,再來就是要在Nginx的設定檔套用它。打開我們的Nginx設定檔

    sudo vim /etc/nginx/conf.d/default.conf

    你會發現Certbot早就在你的設定檔裡加上了許多東西,找到 server區塊,找到ssl_dhparam這個參數,把值換成我們剛剛用openssl算完的那個檔案:

    .....
    server{
    ### .....其他部分省略
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    }

    存檔並離開後,再用這個指令檢查設定檔是否都正確無誤

    sudo nginx -t

再讓Nginx重新讀取設定檔

sudo systemctl reload nginx

你的網站現在更安全多了,再透過SSLLabs檢查一次,現在應該可以得到A等級。

設定憑證自動更新

Let's Encrypt的證書雖然是免費的,但是只有90天的有效期限,我們再來就是要設定每當證書失效時,我們可以自動重新跟Let's Encrypt申請證書。在這裡又展現出了使用Certbot的價值:既然Certbot能夠幫我們連接Let's encrypt來申請證書,那我們只要設定好OS的排程,每天讓Certbot檢查證書是否過期,只要一快要過期就請Certbot重新申請證書,這樣子我們的證書就永遠都是有效的,一切都是那麼自動化

  • unix like的作業系統裡的排程管理 - cron

  • cron是透過一個叫做crontab的檔案來設定。 執行這個指令以打開crontab

    sudo crontab -e

    就會用文字編輯器打開crontab這個檔案,在還沒有設定過任何東西的話,它就是一個空白的文字檔而已。 貼上這行,然後存檔離開。

    15 3 * * * /usr/bin/certbot renew --quiet
    • 15 3 * * *代表每天凌晨3點15分,可以改成任何你想改的時間。
    • /usr/bin/certbot Cerbot程式的執行指令的位置。
    • Certbot的renew指令代表它會檢查目前安裝在系統上的所有憑證,如果在一個月內就要過期了,Certbot就會為它做更新。
    • --quite參數代表這一切都是在背景執行,不須跑出任何資訊,也不用等待User回應。
  • cron將會每天執行這個命令,就能夠為憑證在到期之前做更新。

就這樣,我們的網站的HTTPS的設定就配置好了

要知道的地方是:

  • 在這個過程中,我們使用了Let's encrypt提供的Certbot程式來幫我們處理了大部分的瑣碎實作。

  • 我們網站的HTTPS是跟Nginx互相搭配的。

  • Certbot主要幫我們做了兩件事:

    1. 連接Let's enctrypt以申請證書。
    2. 幫我們修改了我們Nginx的設定檔,以確保連線到我們的網站的訪問者都會與我們的Servr建立HTTPS連線。

    當你在下sudo certbot --nginx -d example.com -d www.example.com的時候,Certbot就會去你的Nginx底下找對應的server區塊裡server_name同樣是 example.com www.example.com 的地方然後幫你做一些調整。

more reference

-- end of file--

response