作者: blaze 時間: 2020-9-1 22:38 標題: 家用免費CA signed SSL Certificate
本帖最後由 blaze 於 2020-9-1 23:03 編輯
終於有時間坐低寫個長po,遲咗啲大家見諒!原po都有唔少ching分享心得,多謝大家。
「點解要用SSL/TLS證書」
如果你唔知咩係SSL/TLS,建議你先停一停,Google攞個background ,睇吓你需唔需要先。
有免費SSL,梗係有唔免費㗎啦!依家啲SSL Certificate(證書/憑證)其實都可以好平,幾蚊美金一年有交易,仲有啲有賠償保障!幾個host/alias的話,DV wildcard都affordable(你用得幾部機嘅話,都應該付擔得起嘅!)。
「咁仲要免費SSL? 」
除咗因為「我就是可以」、「唔想課金」、「想落手落腳」呢啲咁個人嘅理由之外,其實我個人覺得現今科技,安全性好基本,已經唔單單只係講功能性同埋可用性。每一個product同setup都應該“Secured by Design”。SSL/TLS呢啲基本嘢好應該係免費或者低成本做到!保護自己嘅data最正確不過!再者,小數怕長計,既然自己做到就get my hands dirty!
「免費嘅嘢得唔得㗎 ?」
當然係有伏位。”免費SSL”大概可以分為兩種。一種係”self-signed”,另一種就係透過一啲提供免費服務嘅 Certificate Authority CA (證書頒發機構),用certbot獲取。私人用基本上都冇問題!而依個po講嘅係後者。
其實依類型嘅免費CA服務唔計個別機構已知嘅漏洞,係佢地面世嗰陣時係的確有俾人濫用。之前有啲不法之徒恃住呢一樣嘢成本低,申請一啲domain name近似嘅certificates例如 google.com vs g00gle.com,嘗試透過釣魚電郵誤導用家去自己嘅網站,偷人地嘅密碼同埋其他資訊。呢啲安全性嘅問題,就超越左呢一個po嘅範圍,唔多討論。大家記住 ”There is no free lunch!”!食得鹹魚抵得渴!
仲有好重要,免費certificate一般都唔會有好長嘅有效期,我見過30日至90日不等。相信係防止濫用同埋本身服務上可以控制成本。呢一個po當然會講埋自動renew!
「講咁多嘢,呢個教學有咩用?」
原Po 可見大家家用寬頻有唔同程度嘅限制,如果你已經可以用到NAS自帶嘅免費SSL功能,可略過此po。但都講吓依個po響咩情況應該幫到手,基本上申請確認同續期可以透過ACME工具進行,最多採用嘅有HTTP-01(需要web server)同DNS-01(用上DNS record)兩種方法去證明你對指定domain嘅擁有權。依個po係用上DNS-01去處理,點解?
- NAS自帶嘅免費SSL功能用唔到。可以係你唔想開port80/443、external port被佔用或者俾ISP block咗port
- 有幾部server響同一個LAN裏面NAT,想獨自acquire 同renew
- ?? 想要多幾個Subject Alternative Names (SAN ) - 可能原生或者其他方法都得,我冇驗證過
有冇限制?概括一吓用後感:
1. 唔可以用LAN上面嘅hostname放入SAN,更加唔可以放IP address
2. 因為每一個SAN都要認證,所以唔可以亂咁放,例如放埋自己個DDNS domain
3. 如果得一張cert但係又冇得隨便設定SAN,一係就要經過full domain address入server,一係你就每一次入嗰陣時接受browser提你有風險。再複雜就自己簽多一張cert包灑啲internal hostname, IP address加上reverse proxy指定用邊張cert。
「帶個頭盔同埋俾返啲Credit人哋先」
此文純粹技術同埋經驗分享,各位隨便參考。本人不會附上所有因為參考此文或者此文提及嘅其他文章或資源等而發生問題所衍生嘅任何責任。此文參考xfelix.com亦有參與該文之討論。另外參考acme.sh之說明。各位請參考佢哋各自嘅使用條款。
作者: blaze 時間: 2020-9-1 22:55
本帖最後由 blaze 於 2020-9-1 23:02 編輯
所需資源:
- 行到Docker嘅NAS或者其他server。小弟偏好Synology。
- 擁有或者一個你控制到嘅domain(域名),支援DNS API。小弟偏好Cloudflare。
- 如果你用嘅domain name服務唔支援API,acme.sh 另提供DNS manual模式,大家可以自己參閱。
- 如果你用嘅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用呢一個URL加https://hub.docker.com/r/neilpang/acme.sh,或者
- 去Registry(倉庫伺服器)搜尋”acme.sh”,選擇”neilpang/acme.sh”後下載最新image
- 可以直接去Image用呢一個URL加https://hub.docker.com/r/neilpang/acme.sh,或者
- 去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
- Volume (儲存空間):”Add Folder” () > ”Create Folder” () e.g. /docker/acme。之後啲config, certificate同埋key都係喺呢一度generate。”Mount Path” () 輸入 "/acme.sh",不要選”Read-Only”
步驟二:準備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.”
- export CF_Token=“xxxxxx”
步驟三:獲取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 (中繼憑證),呢個其實唔一定要填
- SUBDOMAIN.YOURDOMAIN.COM.key -> Private Key (私鑰)
- 去返個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 群組裏面
[list=2]
- sudo -i
- cd /volume1/docker/acme/SUBDOMAIN.YOURDOMAIN.COM/
[list=2]
- cd /usr/syno/etc/certificate/_archive/
[list=2]
- 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!
攪掂!
希望大家睇得明我寫啲咩嘢!Happy hunting!
作者: heiko 時間: 2020-9-2 09:11
thanks share!!!!
用緊 lets encrypt , Free
不過學多樣野 thanks!!
REF: https://www.minwt.com/website/20735.html
作者: newslalalala 時間: 2020-9-2 11:17
回覆 2# blaze
多謝Ching
作者: fish-ball 時間: 2020-9-2 17:46
Good!Thanks
作者: 123simon 時間: 2020-9-2 18:13
Thank you for share
作者: fatman 時間: 2020-9-2 18:28
Thanks Ching
作者: phacul 時間: 2022-6-29 17:59
Thanks Ching for such a great post !
