這年頭,Internet 上不支援 HTTPS 的網站已不配叫網站。除了瀏覽器會標示「不安全」,第三方 SDK 要求 Callback URL 多半也限定 HTTPS,對外網站少了 TLS 憑證寸步難行。

向憑證廠商申請 TLS 憑證所費不貲,幸好有佛心的 Let's Encrypt 提供免費 TLS 憑證,透過 DNS 網域記錄或網站程式回應完成驗證,任何網站都能免費取得 TLS 憑證改用 HTTPS 加密傳輸。不過,要搞定 Let's Encrypt 的驗證程序及安裝憑證仍有一定技術難度,自己弄要花不少工夫,加上每三個月到期需定期更新,Certbot 能自動驗證安裝憑證加定期更新,便貼心到讓人想起立鼓掌。

要一口氣架好 HTTPS 網站,我目前找到最完美的套餐解決方案是 Nginx + Certbot Docker

實務上 ASP.NET Core/PHP/Pyton 會透過 Reverse Proxy (反向代理伺服器)對外開放,以確保安全及效能,Nginx 標榜單一執行緒、記憶耗用少、穩定性高,強調效能取向,是業界的主流選擇,用 Docker 容器,比直接安裝省事,而使用內建自動下載安裝 TLS 憑證功能的 Nginx + Certbot Docker 容器,我們只需設定好 Nginx .conf 檔,指定 FQDN (例如:www.your-domain.com),啟動容器後直接用 ℎttps://www.you-domain.com 就能連上網站,三個月憑證到期還會自動更新,徹底實現「設後不理」,叫人怎能不愛它。

小資族首選 B1s VM 跑 ASP.NET Core 小服務一文,我整理了在 Debian Linux (為什麼是 Debian 而不是 Ubuntu?請看這篇) 安裝 Nginx + Certbot Docker 的完整步驟,包含:

  1. 安裝 Docker 及 Docker-Composer
  2. 下載 nginx-certbot Docker Image
  3. 下載 ASP.NET Core 範例網站 Docker Image
  4. 設定 /etc/nginx/nginx.conf Nginx 基本設定
  5. 設定 /etc/nginx/conf.d/00.default.conf 設定 Let's Encrypt 回應程式及預設導向 HTTPS
  6. 設定 /etc/nginx/conf.d/01.aspnetcore.conf 指定 HTTPS 站台
  7. 設定 ~/dockers/nginx-certbot/docker-compose.yml Nginx-Certbot 容器設定檔
  8. 設定 ~/dockers/aspnetcore/docker-compose.yml ASP.NET Core 範例網站容器設定檔
  9. 啟動 ~/dockers/nginx-certbot Docker-Compose
  10. 啟動 ~/dockers/aspnetcore Docker-Compose

程序說多不多,說少不少,照著 Copy & Paste 再改幾個參數就能裝好。但既然程序一成不變,只有 FQDN 及 Let's Encrypt 申請人 Email 是變數,每次安裝重做一堆手工有點 Low,把這一整串動作包成 Shell 腳本,一個指令安裝到好才是王道。

懶人如我,過去做過很多類似的自動化,這回不同之處是要嘗試在 Linux 上用 Bash 寫,小小踩到舒適圈的邊界。

所幸,會用到的 Bash 語法邏輯不複雜:

  1. set -e 指定出錯時停止執行
  2. 用 $1 $2 接輸入參數,如 fqdn = $1
  3. 用 if [[ -z $fqdn || -z $email ]]; 檢查參數是否空白
  4. Bash 的 IF 分支寫法: if then .. fi
  5. sudo sed -i "s/@fqdn/$fqdn/g" /etc/nginx/conf.d/01.aspnetcore.conf 可將檔案中的 "@fqdn" 置換成 fqdn 參數內容,由範本動態產生檔案很好用
  6. 用 grep -q "Ubuntu" /etc/issue 偵測 OS 為 Ubuntu/Debian

由於安裝過程需要新增 /etc/nginx/nginx.conf、/etc/nginx/conf.d/00.default.conf、/etc/nginx/conf.d/01.aspnetcore.conf、/dockers/nginx-certbot/docker-compose.yml、/dockers/aspnetcore/docker-compose.yml 五個檔案,我決定將這幾個檔案或範本放上 Github,從https://raw.githubusercontent.com/darkthread/nginx-certbot-docker-nstaller/master/etc/nginx/nginx.conf取得完整檔案內容,執行時用 curl 下載。

將相關檔案放上 Github 專案,新裝好 Debian Linux 後執行以下指令:

curl -O https://raw.githubusercontent.com/darkthread/nginx-certbot-docker-nstaller/master/install.sh
chmod +x install.sh
./install.sh www.mydomain.net username@gmail.com

等待兩分鐘,就能用 https://www.mydomain.net 連上執行中的 ASP.NET Core 示範網站囉,很神奇吧!

安裝過程展示

測完 Debian 我也順手加上 Ubuntu 安裝程序並簡單測過 OK,因此這個自動化腳本應可支援 Debian 跟 Ubuntu,想要新裝 Nginix + Certbot Linux 主機的同學的可以試玩看看。

PS: 覺得好用的話幫忙在 Github 專案 按個星星吧!


Comments

# by Anonymous

呃... traefik 不勞永逸...

# by Anonymous

Nginx proxy manager 已經打包好了

# by Anonymous

夢到了這個 https://hub.docker.com/r/jwilder/nginx-proxy 真是一個讓人回憶的夢

# by Citypig

可以試用看看更懶人的 Cloudflare Free SSL/TLS: https://www.cloudflare.com/zh-tw/ssl/ 。 只要將網域交給 Cloudflare 代管,將子網域設為「通過 Proxy 處理」,再將 SSL/TLS 加密模式設為「Flexible」彈性模式,這樣就行了! Cloudflare 這基本的 CDN、SSL、網頁安全都是免費的。 在 Flexible 彈性模式下,僅用戶的瀏覽器與 Cloudflare 之間是走 SSL 加密,而 Cloudflare 與你的 Server 之間還是使用 http 連線,因此你的 Server 什麼事都不必做。 不過這樣設定之後,我的 WordPress 管理者會無法正常登入,訪客則可正常瀏覽網頁,所以 Cloudflare 應該比較適合功能單純的網頁使用。 管理者要登入 WordPress 則可在自己電腦的 hosts 設定網站的真實 IP 即可解決。

# by Anonymous

>>不過這樣設定之後,我的 WordPress 管理者會無法正常登入,訪客則可正常瀏覽網頁,所以 Cloudflare 應該比較適合功能單純的網頁使用。 >>管理者要登入 WordPress 則可在自己電腦的 hosts 設定網站的真實 IP 即可解決。 你可以使用Page Rules來達成,不必動電腦的hosts

Post a comment