本帖最後由 blaze 於 2020-9-1 23:02 編輯
所需資源:
- 行到Docker嘅NAS或者其他server。小弟偏好Synology。
- 擁有或者一個你控制到嘅domain(域名),支援DNS API。小弟偏好Cloudflare。
- 如果你用嘅domain name服務唔支援API,acme.sh 另提供DNS manual模式,大家可以自己參閱。
- 知道你NAS裏面”root”密碼。以Synology嚟講,即係”admin”密碼
- 有電腦可以SSH去NAS (準備呢一個分享嘅時候其實好似見到acme.sh支援Synology certificate install。應該可以唔使SSH,但係有見到manual話DSM upgrade之後要整啲嘢。感覺上未係太成熟,所以唔睇住)
步驟一:準備acme.sh Docker container
- DSM安裝Docker app。
- Docker app增加image(映像檔):
- 去Image利用啱啱下載嘅image點一下”Launch”(佈署)建立一個container
- 憑自己喜好俾個名(我喺呢度用CONTAINER_NAME做例子)同埋限制資源(好少已經夠,我自己比最低CPU, 48MB RAM)
- 選”Advanced Settings” (進階設定):
- Volume (儲存空間):”Add Folder” () > ”Create Folder” () e.g. /docker/acme。之後啲config, certificate同埋key都係喺呢一度generate。”Mount Path” () 輸入 "/acme.sh",不要選”Read-Only”
- Network (網路):選取 ”Use the same network as Docker Host” (與 Docker 主機同一網路)
- Environment (環境設定):Command (指令)裏面輸入"daemon"
- 最後,完成之前唔好選擇建立後run
步驟二:準備DNS Account ID、API key,配置acme.sh
- acme.sh需要Zone:Zone:Read, and Zone:Dns:Edit permission權限。去Cloudflare dashboard用相關設定去generate一個Application Token
- 2. 亦都記低自己嘅Account ID
- 3. 開一個文字檔案,名為”account.conf”,放進之前剛建立的資料夾 e.g. /docker/acme/。文字檔內容包括API Token及Account ID如下:
- export CF_Token=“xxxxxx”
- export CF_Account_ID=“yyyyy.”
複製代碼
步驟三:獲取certificate同埋key
- 開Docker裏面嘅Container部份,你會見到啱啱建立嘅container。打開container然後Start(啟動)。
- 去Terminal (終端機) tab (頁籤),Create (新增) Launch with Command (使用執行指令),輸入"sh"跟住 Ok。
- 輸入
- acme.sh --issue --dns dns_cf -d SUBDOMAIN.YOURDOMAIN.COM
複製代碼 - Certificate同埋key將會自動生成然後儲存到呢個目錄"/volume1/docker/acme/SUBDOMAIN.YOURDOMAIN.COM/"
步驟四:安裝certificate同埋key
- DSM Control Panel (控制台)裏面Security(安全性)有一個Certificate嘅tab
- 安裝certificate選擇Add(新增),俾個自己認得嘅Description (描述),選擇Import(匯入) 步驟三第四點提及嘅path搵到嘅檔案,對應如下,揀啱檔案”Ok”
- SUBDOMAIN.YOURDOMAIN.COM.key -> Private Key (私鑰)
- SUBDOMAIN.YOURDOMAIN.COM.cer -> Certificate
- ca.cer -> Intermediate Certificate (中繼憑證),呢個其實唔一定要填
- 去返個Docker,可以Stop(停止)頭先嗰個container。
- 最後,條private key應該要從 "/docker/acme/SUNDOMAIN.YOUDOMAIN.COM" 移除或者移到一個安全嘅地方。否則俾人偷咗嘅話係一個安全隱患。
恭喜你!你已經成功將一張免費嘅CA signed SSL certificate擺咗入去呢個NAS!
至於點樣用,就唔喺度詳細講喇。按理呢啲嘢你應該一早識做先至會嚟睇依一個po。如果依張係你第一張cert,DSM應該自動幫你設定為default cert,所以SSL服務都用佢。但係基本來講,DNS CNAME/A record對你嗰個router/firewall external IP,而你部router/firewall設定好port forward,響Control Panel 裏面Security>Certificate嘅tab設定好乜嘢服務用邊一張cert應該就冇咩問題。
好喇,到最後一個步驟!亦都係最麻煩,因為需要SSH去NAS!
步驟五:設定自動renewal
DSM 6.2 以後佢支援多張certificate,所以要先搵出剛才import嗰啲cert同埋key放響邊度!
- 響Control Panel嘅Terminal (終端機) & SNMP裏面打開SSH選項
- 喺自己部電腦度開個command prompt / terminal (Win10, macOS built-in已經有SSH client)
[list=2]
- ssh -l USERNAME [Your NAS’s IP]
複製代碼- USERNAME要喺 NAS 嘅 administrators 群組裏面
提升自己嘅權限去root
[list=2]
要入返USERNAME嘅密碼
確認一下頭先generate嗰啲cert同埋key嘅path- cd /volume1/docker/acme/SUBDOMAIN.YOURDOMAIN.COM/
複製代碼 再去搵出import咗嘅cert同key放喺邊度
[list=2]
首先- cd /usr/syno/etc/certificate/_archive/
複製代碼 "ll" 睇吓裏面有乜嘢,如果你只係得一套certificate,你應該只會見到一個folder,而個名係一串似乎係random嘅六位英數
萬一有多個一個的話,可以睇吓裏面啲檔案嘅timestamp,或者睇吓一個叫做INFO嘅檔案,裏面有描述。”desc”應該係你頭先步驟四第二點import cert同key嘅時候自己打。
因為依個folder名個個都唔同,我喺呢度俾個名佢 RANDOM_PATH
最後我哋去Control Panel裏面嘅Task Scheduler(任務排程表)加一個Task:
[list=2]
Create (新增) > Scheduled Task (排程任務) -> User-defined Script (使用者定義指令碼)
General (一般設定) tab:Task (任務名稱) 俾一個你認得嘅名,User (使用者帳號) 選擇”root”,選擇Enabled (已啟用)
Schedule (排程):Date(日期)選擇Run on the following date (在以下日子執行),揀選一個日子同埋選擇”Repeat monthly” (每月重複)。時間方面可以自行選擇。
Task Settings (任務設定):Send run details by email (透過電子郵件傳送執行細節) 我一般都會打開,可以睇吓行咗啲乜嘢。User-defined script如下:
- echo
- echo Let’s Encrypt SSL Certificate Renewal
- echo
- echo Starting docker container CONTAINER_NAME with acme.sh in daemon mode…
- echo
- docker start CONTAINER_NAME
- echo
- echo Sleep for 2 minutes…
- sleep 2m
- echo
- echo Execute acme.sh renewal command for SUBDOMAIN.YOURDOMAIN.COM using DNS-01 with Clareflare hook…
- echo
- docker exec CONTAINER_NAME acme.sh --renew --dns dns_cf -d SUBDOMAIN.YOURDOMAIN.COM
- echo
- echo Sleep for 2 minutes…
- sleep 2m
- echo
- echo Attempting to overwrite public certificate…
- echo
- rsync -avh /volume1/docker/acme/SUBDOMAIN.YOURDOMAIN.COM/SUBDOMAIN.YOURDOMAIN.COM.cer /usr/syno/etc/certificate/_archive/RANDOM_PATH/cert.pem
- #echo
- #echo Attempting to overwrite private key…
- #echo
- #rsync -avh /volume1/docker/acme/SUBDOMAIN.YOURDOMAIN.COM/SUBDOMAIN.YOURDOMAIN.COM.key /usr/syno/etc/certificate/_archive/RANDOM_PATH/privkey.pem
- echo
- echo Attempting to overwrite certificate chain…
- echo
- rsync -avh /volume1/docker/acme/SUBDOMAIN.YOURDOMAIN.COM/fullchain.cer /usr/syno/etc/certificate/_archive/RANDOM_PATH/fullchain.pem
- echo
- echo Attempting to overwrite CA certificate…
- echo
- rsync -avh /volume1/docker/acme/SUBDOMAIN.YOURDOMAIN.COM/ca.cer /usr/syno/etc/certificate/_archive/RANDOM_PATH/chain.pem
- echo
- echo Attempting to remove the private key from docker folder and modify file permissions to owner read-only
- echo
- #rm -v /volume1/docker/acme/SUBDOMAIN.YOURDOMAIN.COM/*.key
- chmod 400 /usr/syno/etc/certificate/_archive/RANDOM_PATH/*
- echo
- echo Attempting to restart web server…
- echo
- /usr/syno/etc/rc.sysv/nginx.sh reload
- echo
- echo Stopping docker container…
- docker stop CONTAIN_NAME
- sleep 2m
- echo
- echo Bye!
複製代碼 響個script裏面有幾句係comment咗 (i.e."#" 開頭)係因為xfelix.com原文使用acme.sh既force issue重新簽新嘅certificate包括重新generate public/private key pair。我自己唔太鐘意依個方法,所以自己改做renewal。如果大家想用force issue,可以將 "docker exec" 裏面嘅 "--renew" 改為 "--issue --force" 。其他comment咗嘅都要攞走個"#"因為要update埋條private key同埋移除 "/docker/acme/SUBDOMAIN.YOURDOMAIN.COM/" 裏面嘅private key。
攪掂!
希望大家睇得明我寫啲咩嘢!Happy hunting! |