2024年2月20日 星期二

Mapleboard MP510-50 測試 (十八) : 註冊 Let's Encrypt 的 SSL/TLS 憑證

申請好網域名稱後, 網站其實只有 HTTP 協定功能, 接下來必須安裝 SSL/TLS 憑證, 這樣網站才會有 HTTPS 加密傳輸功能, 否則瀏覽器連線網站時都會先顯示這是不安全的網站, 雖然按繼續瀏覽還是可以進入網站首頁, 但這樣的存取並不安全. 

以前憑證須要花錢買 (一年大約要 2~3 千元), 且年年要續約, 現在有免費的 Let's Encrypt 可用, 但先決條件是你的網站必須要有一個域名 (domain name), 我過年前便已向 Namecheap 購買了 tony1966.cc 的域名 (10 年 59.8 美元, 每年約 191 元台幣, 如其名真的很便宜), 參考 :


我原先是在下面這本書的 16.3 節看到 Let's Encrypt 的介紹 :

# 活用 django4 建構動態網站的 16 堂課 (博碩, 2023, 何敏煌, 林亮昀) 

不過此書是以 Apache 伺服器為例說明設定方式, 但我用的是 Nginx 伺服器, 所以主要是參考下面兩篇教學文章進行設定 : 



一. 關於 SSL 與 HTTPS 加密傳輸 : 

先摘要整理 SSL 加密憑證的相關知識如下 : 
  1. 傳統的 HTTP 協定是以明碼方式傳遞, 並未將內容加密, 只要用封包探測軟體就能輕易擷取用 HTTP 傳送的機敏內容, 例如帳號密碼, API 的存取密鑰 (access key) 或權杖 (csrf_token) 等, 駭客就能利用這些資訊送出假造的請求來進行網路攻擊或滲透. 
  2. SSL (Secure Soket Layer) 使用非對稱金鑰在後端網站與前端瀏覽器之間建立可信任的 HTTPS 加密傳輸, 當以 HTTPS 連線網站伺服器時, 伺服器主機會提供一把公鑰 (public key) 給瀏覽器, 讓它用來將欲傳送的內容加密, 當伺服器收到這加密過的資料, 就會用與那把公鑰對應的私鑰 (private key) 進行解密來取得原始的資料. 不過, SSL 只是安全性憑證的通稱, 事實上現在使用的是比 SSL 更安全的進階版 : TLS (Tranport Layer Security) .
  3. 但是當瀏覽器連線 HTTPS 網站時收到對方發送的公鑰時, 要如何辨別這把公鑰是真是假? 這時候就需要一個第三方的公正單位來提供信任查詢服務, 這個公正單位稱為憑證中心. 網站管理者如果要提供 HTTPS 安全連線功能, 必須提供網域名稱等資料向憑證中心提出申請, 當驗證通過後會得到一對金鑰並安裝在伺服器主機中並做好設定, 當客戶端提出 HTTPS 請求時伺服器會向其傳送公鑰, 瀏覽器收到後自動向憑證中心查詢此公鑰持有者是否可信任, 若驗證通過才會進行 SSL 加密傳輸. 
  4. 大部分的商用憑證必須付費購買且定期重新驗證, Let's Encrypt 是由 Google, IBM, Cisco 等大企業捐資成立的免費憑證頒發機構 ( CA, Certificate Authority, 憑證中心), 任何擁有網域名稱的主機管理人均可從 Let's Encrypt 獲得可信任的憑證, 替網站啟用 HTTPS (SSL/TLS) 功能. 其頒發的憑證效期為三個月, 亦即每三個月須重新驗證 (可透過程式自動更新憑證). Let's Encrypt 的驗證方式較初階, 憑證申請者 (也就是網站管理者) 必須在伺服器的特定資料夾下放置憑證中心指定之檔案, 以證明申請者擁有網站的管理權限. 參考 :

    https://letsencrypt.org/zh-tw/

二. 使用 Certbot 套件註冊 Let's Encrypt 憑證 : 

Certbot 套件是一個軟體工具, 用來向 Let's Encrypt 註冊憑證並於到期前自動更新, 此軟體由位於美國舊金山的非營利機構電子前沿基金會 (Electronic Frontier Foundation) 設計與維護, 參考


Certbot 同時支援 Apache 與 Nginx 伺服器. 以下是安裝程序 :


1. 更新本機套件索引 : 

用下列指令更新套件索引 :

sudo apt update   

tony1966@LX2438:~$ sudo apt update     
[sudo] tony1966 的密碼: 
下載:1 http://packages.microsoft.com/repos/code stable InRelease [3,589 B]
已有:2 http://deb.mapleboard.org/mp510 jammy InRelease                 
下載:3 http://packages.microsoft.com/repos/code stable/main amd64 Packages [16.2 kB]
下載:4 https://linux.teamviewer.com/deb stable InRelease [11.9 kB]             
已有:5 http://ports.ubuntu.com jammy InRelease                                 
下載:6 http://packages.microsoft.com/repos/code stable/main arm64 Packages [16.4 kB]
下載:7 http://packages.microsoft.com/repos/code stable/main armhf Packages [16.3 kB]
下載:8 http://ports.ubuntu.com jammy-security InRelease [110 kB]
下載:9 http://ports.ubuntu.com jammy-updates InRelease [119 kB]
已有:10 http://ports.ubuntu.com jammy-backports InRelease
下載:11 http://ports.ubuntu.com jammy-updates/main arm64 Packages [1,193 kB]
下載:12 http://ports.ubuntu.com jammy-updates/main armhf Packages [768 kB]
取得 2,254 kB 用了 4s (504 kB/s)                           
正在讀取套件清單... 完成
正在重建相依關係... 完成
正在讀取狀態資料... 完成  
可升級 37 個套件。執行 apt list --upgradable 檢視


2. 安裝 Certbot 套件 : 

指令如下 :

sudo apt install certbot python3-certbot-nginx -y   

tony1966@LX2438:~$ sudo apt install certbot python3-certbot-nginx -y    
正在讀取套件清單... 完成
正在重建相依關係... 完成  
正在讀取狀態資料... 完成  
下列的額外套件將被安裝:
  python3-acme python3-certbot python3-certifi python3-configargparse python3-configobj python3-icu python3-idna
  python3-josepy python3-openssl python3-parsedatetime python3-requests python3-requests-toolbelt python3-rfc3339
  python3-tz python3-zope.component python3-zope.event python3-zope.hookable python3-zope.interface
建議套件:
  python-certbot-doc python3-certbot-apache python-acme-doc python-certbot-nginx-doc python-configobj-doc
  python-openssl-doc python3-openssl-dbg python3-socks python-requests-doc
下列【新】套件將會被安裝:
  certbot python3-acme python3-certbot python3-certbot-nginx python3-certifi python3-configargparse python3-configobj
  python3-icu python3-idna python3-josepy python3-openssl python3-parsedatetime python3-requests
  python3-requests-toolbelt python3-rfc3339 python3-tz python3-zope.component python3-zope.event
  python3-zope.hookable python3-zope.interface
升級 0 個,新安裝 20 個,移除 0 個,有 37 個未被升級。
需要下載 1,440 kB 的套件檔。
此操作完成之後,會多佔用 7,316 kB 的磁碟空間。
下載:1 http://ports.ubuntu.com jammy/main arm64 python3-openssl all 21.0.0-1 [45.2 kB]
下載:2 http://ports.ubuntu.com jammy/universe arm64 python3-josepy all 1.10.0-1 [22.0 kB]
下載:3 http://ports.ubuntu.com jammy/main arm64 python3-certifi all 2020.6.20-1 [150 kB]
下載:4 http://ports.ubuntu.com jammy/main arm64 python3-idna all 3.3-1 [49.3 kB]
下載:5 http://ports.ubuntu.com jammy-security/main arm64 python3-requests all 2.25.1+dfsg-2ubuntu0.1 [48.8 kB]
下載:6 http://ports.ubuntu.com jammy/main arm64 python3-requests-toolbelt all 0.9.1-1 [38.0 kB]
下載:7 http://ports.ubuntu.com jammy-updates/main arm64 python3-tz all 2022.1-1ubuntu0.22.04.1 [30.7 kB]
下載:8 http://ports.ubuntu.com jammy/main arm64 python3-rfc3339 all 1.1-3 [7,110 B]
下載:9 http://ports.ubuntu.com jammy-updates/universe arm64 python3-acme all 1.21.0-1ubuntu0.1 [36.4 kB]
下載:10 http://ports.ubuntu.com jammy/universe arm64 python3-configargparse all 1.5.3-1 [26.9 kB]
下載:11 http://ports.ubuntu.com jammy/main arm64 python3-configobj all 5.0.6-5 [34.8 kB]
下載:12 http://ports.ubuntu.com jammy/universe arm64 python3-parsedatetime all 2.6-2 [32.9 kB]
下載:13 http://ports.ubuntu.com jammy/universe arm64 python3-zope.hookable arm64 5.1.0-1build1 [11.4 kB]
下載:14 http://ports.ubuntu.com jammy/main arm64 python3-zope.interface arm64 5.4.0-1build1 [142 kB]
下載:15 http://ports.ubuntu.com jammy/universe arm64 python3-zope.event all 4.4-3 [8,180 B]
下載:16 http://ports.ubuntu.com jammy/universe arm64 python3-zope.component all 4.3.0-3 [38.3 kB]
下載:17 http://ports.ubuntu.com jammy/universe arm64 python3-certbot all 1.21.0-1build1 [175 kB]
下載:18 http://ports.ubuntu.com jammy/universe arm64 certbot all 1.21.0-1build1 [21.3 kB]
下載:19 http://ports.ubuntu.com jammy/universe arm64 python3-certbot-nginx all 1.21.0-1 [35.4 kB]
下載:20 http://ports.ubuntu.com jammy/main arm64 python3-icu arm64 2.8.1-0ubuntu2 [486 kB]
取得 1,440 kB 用了 5s (300 kB/s)      
正在預先設定套件 ...
選取了原先未選的套件 python3-openssl。
(讀取資料庫 ... 目前共安裝了 289364 個檔案和目錄。)
正在準備解包 .../00-python3-openssl_21.0.0-1_all.deb……
解開 python3-openssl (21.0.0-1) 中...
選取了原先未選的套件 python3-josepy。
正在準備解包 .../01-python3-josepy_1.10.0-1_all.deb……
解開 python3-josepy (1.10.0-1) 中...
選取了原先未選的套件 python3-certifi。
正在準備解包 .../02-python3-certifi_2020.6.20-1_all.deb……
解開 python3-certifi (2020.6.20-1) 中...
選取了原先未選的套件 python3-idna。
正在準備解包 .../03-python3-idna_3.3-1_all.deb……
解開 python3-idna (3.3-1) 中...
選取了原先未選的套件 python3-requests。
正在準備解包 .../04-python3-requests_2.25.1+dfsg-2ubuntu0.1_all.deb……
解開 python3-requests (2.25.1+dfsg-2ubuntu0.1) 中...
選取了原先未選的套件 python3-requests-toolbelt。
正在準備解包 .../05-python3-requests-toolbelt_0.9.1-1_all.deb……
解開 python3-requests-toolbelt (0.9.1-1) 中...
選取了原先未選的套件 python3-tz。
正在準備解包 .../06-python3-tz_2022.1-1ubuntu0.22.04.1_all.deb……
解開 python3-tz (2022.1-1ubuntu0.22.04.1) 中...
選取了原先未選的套件 python3-rfc3339。
正在準備解包 .../07-python3-rfc3339_1.1-3_all.deb……
解開 python3-rfc3339 (1.1-3) 中...
選取了原先未選的套件 python3-acme。
正在準備解包 .../08-python3-acme_1.21.0-1ubuntu0.1_all.deb……
解開 python3-acme (1.21.0-1ubuntu0.1) 中...
選取了原先未選的套件 python3-configargparse。
正在準備解包 .../09-python3-configargparse_1.5.3-1_all.deb……
解開 python3-configargparse (1.5.3-1) 中...
選取了原先未選的套件 python3-configobj。
正在準備解包 .../10-python3-configobj_5.0.6-5_all.deb……
解開 python3-configobj (5.0.6-5) 中...
選取了原先未選的套件 python3-parsedatetime。
正在準備解包 .../11-python3-parsedatetime_2.6-2_all.deb……
解開 python3-parsedatetime (2.6-2) 中...
選取了原先未選的套件 python3-zope.hookable。
正在準備解包 .../12-python3-zope.hookable_5.1.0-1build1_arm64.deb……
解開 python3-zope.hookable (5.1.0-1build1) 中...
選取了原先未選的套件 python3-zope.interface。
正在準備解包 .../13-python3-zope.interface_5.4.0-1build1_arm64.deb……
解開 python3-zope.interface (5.4.0-1build1) 中...
選取了原先未選的套件 python3-zope.event。
正在準備解包 .../14-python3-zope.event_4.4-3_all.deb……
解開 python3-zope.event (4.4-3) 中...
選取了原先未選的套件 python3-zope.component。
正在準備解包 .../15-python3-zope.component_4.3.0-3_all.deb……
解開 python3-zope.component (4.3.0-3) 中...
選取了原先未選的套件 python3-certbot。
正在準備解包 .../16-python3-certbot_1.21.0-1build1_all.deb……
解開 python3-certbot (1.21.0-1build1) 中...
選取了原先未選的套件 certbot。
正在準備解包 .../17-certbot_1.21.0-1build1_all.deb……
解開 certbot (1.21.0-1build1) 中...
選取了原先未選的套件 python3-certbot-nginx。
正在準備解包 .../18-python3-certbot-nginx_1.21.0-1_all.deb……
解開 python3-certbot-nginx (1.21.0-1) 中...
選取了原先未選的套件 python3-icu。
正在準備解包 .../19-python3-icu_2.8.1-0ubuntu2_arm64.deb……
解開 python3-icu (2.8.1-0ubuntu2) 中...
設定 python3-configargparse (1.5.3-1) ...
設定 python3-parsedatetime (2.6-2) ...
設定 python3-icu (2.8.1-0ubuntu2) ...
設定 python3-zope.event (4.4-3) ...
設定 python3-zope.interface (5.4.0-1build1) ...
設定 python3-openssl (21.0.0-1) ...
設定 python3-tz (2022.1-1ubuntu0.22.04.1) ...
設定 python3-zope.hookable (5.1.0-1build1) ...
設定 python3-configobj (5.0.6-5) ...
設定 python3-certifi (2020.6.20-1) ...
設定 python3-idna (3.3-1) ...
設定 python3-josepy (1.10.0-1) ...
設定 python3-rfc3339 (1.1-3) ...
設定 python3-zope.component (4.3.0-3) ...
設定 python3-requests (2.25.1+dfsg-2ubuntu0.1) ...
設定 python3-requests-toolbelt (0.9.1-1) ...
設定 python3-acme (1.21.0-1ubuntu0.1) ...
設定 python3-certbot (1.21.0-1build1) ...
設定 certbot (1.21.0-1build1) ...
Created symlink /etc/systemd/system/timers.target.wants/certbot.timer → /lib/systemd/system/certbot.timer.
設定 python3-certbot-nginx (1.21.0-1) ...
執行 man-db (2.10.2-1) 的觸發程式……
tony1966@LX2438:~$ 


3. 向 Let's Encrypt 註冊憑證 : 

指令如下 :

sudo certbot --nginx --redirect -d tony1966.cc     

此處 -d tony1966.cc 表示為我的網站域名 http://tony1966.cc 註冊憑證, 如有多個網址就在後面加 -d domain_name 即可. --redirect 表示會自動將對 http://tony1966.cc 的請求轉成 https://tony1966.cc :

tony1966@LX2438:~$ sudo certbot --nginx --redirect -d tony1966.cc    
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): 此處輸入我的 Hinet 信箱  

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y     <== 必須輸入 Y 才能繼續

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y     <== 建議輸入 Y (可收到關於 Certbot 與 Let's Encrypt 消息)
Account registered.
Requesting a certificate for tony1966.cc

Successfully received certificate.     <== 收到憑證了
Certificate is saved at: /etc/letsencrypt/live/tony1966.cc/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/tony1966.cc/privkey.pem     <== 金鑰儲存位置
This certificate expires on 2024-05-20.    <== 憑證到期日 (有效期限 3 個月) 
These files will be updated when the certificate renews.     <== 到期前Certbot 會自動更新
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for tony1966.cc to /etc/nginx/sites-enabled/default
Congratulations! You have successfully enabled HTTPS on https://tony1966.cc

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
tony1966@LX2438:~$ 

這樣便註冊與安裝好憑證了, 有效期限為 3 個月, 但 Certbot 會自動檢查是否需要更新憑證 (使用 Crontab 計時器, 每天檢查 2 次), 所以不用擔心 HTTPS 功能會因為憑證到期未更新而停擺的問題. 可以用下列指令檢查 Certbot 自動檢查機制目前的狀態 :

sudo systemctl status certbot.timer   

tony1966@LX2438:~$ sudo systemctl status certbot.timer    
● certbot.timer - Run certbot twice daily
     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Tue 2024-02-20 21:12:14 CST; 25min ago
    Trigger: Wed 2024-02-21 08:06:44 CST; 10h left
   Triggers: ● certbot.service

看到 active 表示自動檢查憑證是否到期功能目前正啟動中. 

如果想要手動更新憑證, 指令如下 :

sudo certbot renew    

這樣便完成 HTTPS 憑證的註冊安裝了, 亦即我的網站已有 HTTPS 加密傳輸功能了, 馬上開啟瀏覽器測試, 在網址列輸入 http://tony1966.cc :




網址果然如預期被自動轉成 https://tony1966.cc 且正常顯示網頁, 收工啦. 


2024-02-21 補充 :

Nginx 預設的網站設定檔位於 /etc/nginx/sites-enabled 下的 default, 用 cat 瀏覽此檔, 在最底下會看到 Certbot 已經幫我們自動修改內容 : 

tony1966@LX2438:~$ cat /etc/nginx/sites-enabled/default  

... (略) ...

server {
listen 80 default_server;          <== 監聽 80 埠 (HTTP)
listen [::]:80 default_server;

... (略) ...

root /var/www/html;               <== 網站根目錄位置

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
    server_name tony1966.cc; # managed by Certbot    

...(略)...

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot        <== 監聽 443 埠 (HTTPS)
    ssl_certificate /etc/letsencrypt/live/tony1966.cc/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/tony1966.cc/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = tony1966.cc) {
        return 301 https://$host$request_uri;     <== 將 http 自動轉成 https
    } # managed by Certbot


listen 80 ;
listen [::]:80 ;
    server_name tony1966.cc;
    return 404; # managed by Certbot


}

沒有留言 :