自動更新 Linode Object Storage SSL/TLS憑證

前一篇文章,我們了解了如何自訂Linode Object Storage的網域,但因Object Storage需要自己手動上傳SSL憑證,且Let’s Encrypt的憑證90天會到期,因此每到即將過期的時間,勢必就得再手動更新一次。因此,這篇就要繼續來了解,如何自動更新憑證。

首先,我們上次安裝的certbot,會自動排程更新憑證,確保憑證不會過期。而我們要做的就是,將certbot更新後的 fullchain.pem 與 private.pem 透過Linode的API重新上傳到Linode。

於是,我寫了一個nodejs的小工具,來專門處理這件事情。在開始之前,先用 node -v 確認一下是否有安裝 nodejs 並且版本 > 16.20。

  1. 請在之前的教學中,安裝了certbot的那台機器中 clone我的這個repo,執行:git clone git@github.com:boggyjan/linode-object-storage-cert-updater.git
  2. 接著進入linode-object-storage-cert-updater目錄,執行:npm i,安裝相依套件
  3. 複製兩個sample config成為真正的config:
    • 執行:cp pm2.config.cjs.sample pm2.config.cjs
    • 執行:cp updater.config.js.sample updater.config.js
  4. 修改 updater.config.js
    • 填入Linode API Token,可到這裡新增
    • 在certs陣列裡修改成你的 region, bucket名稱,以及這台機器中存放憑證的地方 certPath
    • 範例中為兩個bucket,可視需求新增或移除
  5. 啟動自動更新,因需讀取etc目錄中的檔案需root權限,請用root身份執行pm2:
    • sudo su root
    • pm2 start pm2.config.cjs
  6. 設定開機就執行:pm2 startup && pm2 save

Linode Object Storage 自訂網域設定與大阪region Cyberduck設定

Custom Domain 步驟

開好 Linode 的 Object Storage 之後,常常覺得網址有夠長,查了一下自訂網域的方式。跟 AWS 比起來麻煩多了,還要自己用 Certbot 手動建立 ssl 憑證,而這也意味著會遇到無法自動更新憑證的問題。之後會再介紹用 API 更新憑證的方法,這篇的重點就先放在整個設定的步驟。

設定 Object Storage 的自訂網域,因為會需要用到 certbot 手動驗證,需要仔細檢查每個步驟是否都有確實完成再進行下一步,不然很有可能會在驗證步驟重做很多次。請依照以下的步驟進行設定:

  1. 先建立一個Bucket
    1. Label名稱填寫網域名稱,例如static.abc.com。目前僅能支援子網域
    2. Bucket Access設成Public Read
  2. 到網域設定新增CNAME
    1. hostname 打static
    2. alias to static.abc.com.{這邊填你的object storage的region,例如jp-osa-1}.linodeobjects.com
  3. 接下來要使用certbot建立ssl憑證
    1. 輸入 certbot certonly –manual
    2. 輸入網域 static.abc.com
    3. 在bucket中建立.well-known資料夾,在.well-known資料夾中建立acme-challenge資料夾
    4. 把顯示的code跟指定的檔名上傳到bucket的 .well-known/acme-challenge 資料夾裡,如圖:
    5. 將該檔案的ACL設成Public Read
    6. 回到certbot按下Enter開始驗證
    7. 驗證完成後,會產生金鑰檔案在/etc/letsencrypt/live/static.abc.com資料夾中
    8. 首先執行 cat /etc/letsencrypt/live/static.abc.com/fullchain.pem 複製所有內容
    9. 貼入 bucket 內頁的 SSL/TLS Certificate文字框
    10. 再執行 cat /etc/letsencrypt/live/static.abc.com/privkey.pem 複製所有內容
    11. 貼入 bucket 內頁的 SSL/TLS Private Key文字框
    12. 送出後即可

繼續設定自動更新憑證

大阪 Region 的 Cyberduck 設定

因為目前(2023年9月)Preference > Profile 裡面目前還沒有 Osaka Region 的 Linode 可選,但還是可以連線,請依照以下的步驟進行設定:

  1. 不要點選新增連線,點主畫面左下角的加號
  2. 選擇 Amazone S3
  3. 伺服器填寫:jp-osa-1.linodeobjects.com
  4. 輸入金鑰:
    1. 請先到 Object Storage > Access Keys 建立金鑰
    2. 將金鑰儲存在本機
    3. 填入 Access Key
    4. 填入 Secret Key
  5. 路徑需要先隨便填一個存在的 bucket 的名稱,例如:static.abc.com
  6. 這樣就完成設定了。關閉編輯視窗後,在列表上剛剛建立的項目上點兩下即可
  7. 要變換同一個region中的bucket,請選上方下拉選單的 / 就會出現所有bucket