immwind

长风

life, the programming and everything

透過 Docker 為群暉申請 SSL 證書,並設定自動更新

介紹#

  • acme.sh:自動申請和更新證書的工具
  • Cloudflare:域名解析和托管平台(其中之一服務)
  • Let’s Encrypt:免費的證書頒發機構(有效期三個月)

準備#

申請 Cloudflare Token#

因為要對域名進行驗證,需要先申請有編輯對應域名 DNS 權限的 Token:

  1. 用戶 API 令牌 處點擊創建令牌
  2. 選擇編輯區域 DNS 處點擊使用模板
  3. 之後在區域資源選擇要申請證書的域名
  4. 保存

開啟群智 SSH 登錄#

登錄群智 Web,進入控制面板 -> 終端機和 SNMP,勾選啟動 SSH 功能後保存。

注:另一種方案是直接通過群智的任務計劃執行每一個操作。

證書申請#

以下操作是在成功通過 [[SSH]] 連接群智的情況下執行,每個操作前 export 變量只要執行過一次即可,無須重複運行,在代碼中顯示只是為了更加直觀。

默認情況下群智的的帳號沒有加入 [[Docker]] 組,因此先切換到 root 帳號方便操作,當然也可以為每個命令加 [[sudo]] 前綴執行,下面以切換到 root 帳號為例子:

sudo -i

然後創建存放域名證書的文件夾:

mkdir -p /volume1/docker/acme.sh

註冊 ACME 帳號#

export ACMEPATH="/volume1/docker/acme.sh" # 上一步創建的路徑
export EMAIL="mail@example.com" # 用於註冊 letsencrypt 的郵箱

docker run --rm \
  -v "${ACMEPATH}":/acme.sh \
  --net=host \
  neilpang/acme.sh \
  --register-account \
  -m "${EMAIL}" \
  --server letsencrypt
  • --rm:表示容器用完後立即銷毀
  • --server:指定

申請證書#

export ACMEPATH="/volume1/docker/acme.sh"
export DOMAIN="mail@example.com"
export CFTOKEN="Gl8exdSXRRwGxg5EjVnTDzYY42" # Cloudflare 申請的 Token

docker run --rm \
  -v "${ACMEPATH}":/acme.sh \
  -e CF_Token="${CFTOKEN}" \
  --net=host \
  neilpang/acme.sh \
  --issue \
  --dns dns_cf \
  --ocsp \
  --server letsencrypt \
  -d "${DOMAIN}" \
  -d "*.${DOMAIN}"

CFTOKEN 變量處填入 申請 Cloudflare Token 獲取的 Token。

部署證書#

export ACMEPATH="/volume1/docker/acme.sh"
export DOMAIN="immwind.com"
export USERNAME="username"  # 群智登錄帳號
export PASSWORD="password"  # 群智登錄密碼
export PORT="5001"          # HTTPS 端口

docker run --rm \
  -v "${ACMEPATH}":/acme.sh \
  -e SYNO_Username="${USERNAME}" \
  -e SYNO_Password="${PASSWORD}" \
  -e SYNO_Scheme="https" \
  -e SYNO_Port="${PORT}" \
  -e SYNO_Certificate="A different certificate" \
  --net=host \
  neilpang/acme.sh \
  --deploy --insecure \
  --deploy-hook synology_dsm \
  -d "${DOMAIN}" -d "*.${DOMAIN}"
  • SYNO_Certificate:是群智證書介面對應域名下方的說明

部署完成後就可以在控制面板 -> 安全性 -> 證書處看到申請的域名證書,並進行設置。

自動更新證書配置#

登錄群智 Web 後,進入控制面板:

  1. 選擇任務計劃
  2. 新增 -> 計劃的任務 -> 用戶定義的腳本
  3. 在任務設置 -> 執行命令部分填入下方內容(包括變量)
export ACMEPATH="/volume1/docker/acme.sh"
export DOMAIN="immwind.com"
export CFTOKEN="Gl8exdSXRRwGxg5EjVnTDzYY42"

export USERNAME="username"  # 群智登錄帳號
export PASSWORD="password"  # 群智登錄密碼
export PORT="5001"          # HTTPS 端口

docker run --rm \
  -v "${ACMEPATH}":/acme.sh \
  -e CF_Token="${CFTOKEN}" \
  --net=host \
  neilpang/acme.sh \
  --renew --force \
  --dns dns_cf \
  --ocsp \
  --server letsencrypt \
  -d "${DOMAIN}" -d "*.${DOMAIN}"

docker run --rm \
  -v "${ACMEPATH}":/acme.sh \
  -e SYNO_Username="${USERNAME}" \
  -e SYNO_Password="${PASSWORD}" \
  -e SYNO_Scheme="https" \
  -e SYNO_Port="${PORT}" \
  -e SYNO_Certificate="A different certificate" \
  --net=host \
  neilpang/acme.sh \
  --deploy --insecure \
  --deploy-hook synology_dsm \
  -d "${DOMAIN}" -d "*.${DOMAIN}"

任務可以每月執行一次,不過為了確保任務正常運行,可以先手動執行一次看是否成功。

最後#

配置完後,突然想起 [[ESXi]] 的證書也過期了許久,是不是也可以折騰下。

資訊#

環境#

  • DSM 7.2
  • Docker 20.10.23

參考#

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。