2021.10.31 更新:DSM 7 排程指令有變,只需要修改排程最後一行就可。
2020.03.21 更新:之前的教學沒有把 SSL 證書安裝到 NAS 的 nginx 上,會導致讀到舊的證書而失效,目前已更正。
目前,我的 linode 主機裡面的所有子網域(*.hiraku.tw)都已經使用了 Let's Encrypt 的 Wildcard SSL 憑證。
不過由於有一個子網域是指向我放在家裡的 Synology NAS,在 DSM 系統裡面雖然也可以取得 Let's Encrypt 憑證,但是目前並不能獲得 Wildcard 憑證。而我在 NAS 上面因為架設了一些服務,導致連到這台 NAS 的子網域越來越多,每個網域都去要一次憑證實在很麻煩,也有可能不小心達到 Let's Encrypt 的要求次數上限,所以就研究出了一個把 linode 主機上的憑證複製到 NAS 來使用的方法。
首先,你要先下載遠端主機的 Wildcard 憑證到電腦中。因為每個人儲存憑證的位置都不一樣,所以這邊請務必換成你的路徑,以我來說,我下載了 /etc/nginx/ssl/hiraku.tw/fullchain.cer
、/etc/nginx/ssl/hiraku.tw/private.key
這兩個檔案。
接下來到 DSM 的「控制台 → 安全性 → 憑證」裡面,選擇「新增 → 新增憑證 → 匯入憑證」,會出現如下圖畫面,選擇剛剛下載的兩個檔案並對應到正確的選項,再按確定。
這時候我們就成功匯入遠端主機中的 SSL 憑證了。
不過這樣的話,由於 Let's Encrypt 每 90 天就會過期一次,要常常匯入實在很麻煩,所以接下來,我們要讓 NAS 可以自動抓取遠端主機的憑證。
首先,我們一定要先把剛剛匯入的憑證,在 DSM 的視窗裡面改為「預設憑證」,才可以進行接下來的動作。
接著,你的 DSM 必須要可以用 SSH 進入,還有必須要用 root 帳號進去 SSH。要如何用 root 登入 NAS 的 SSH 請看官方教學。用 root 登入後,我們先下指令 mkdir /root/.ssh
,接著打開你的「電腦」的終端機,產生新的 SSH key。產生方式依照電腦作業系統有所不同,這部分也請去看其他網站的教學。之後,我們把建立的 key(id_rsa、id_rsa.pub)放到 NAS 的 /root/.ssh
底下。(溫馨提醒:NAS 裡面可以用 vim,可以直接貼上內容存檔...),接著下指令 chmod -R 600 /root/.ssh
,再下指令 cat /root/.ssh/id_rsa.pub
,把出現的內容複製到遠端 linux 主機的 authorized_keys 裡面。
以上簡單來說,就是你要讓你的 NAS 建立 SSH key 並且讓它可以免密碼連到遠端主機就是了啦!弄好之後記得在 NAS 裡面測試一下是否真的能 SSH 連上遠端主機。
接下來,請在 NAS 的終端機裡面下指令 hash=$(cat "/usr/syno/etc/certificate/_archive/DEFAULT")
,跟 folder="/usr/syno/etc/certificate/_archive/"$hash
,這兩個指令第一個是獲得預設憑證的資料夾名稱,第二個指令就是獲得預設憑證的完整資料夾位置。
ls $folder
一下,會發現有三個檔案,cert.pem、fullchain.pem、privkey.pem,明明剛剛我們只有匯入兩個檔案啊!不過其實 cert.pem 跟 fullchain.pem 是完全一樣內容的,所以實際上還是只有兩個檔案。
再分別下指令
1 2 3 |
scp nas@connect.hiraku.tw:/etc/nginx/ssl/hiraku.tw/fullchain.cer $folder/cert.pem scp nas@connect.hiraku.tw:/etc/nginx/ssl/hiraku.tw/fullchain.cer $folder/fullchain.pem scp nas@connect.hiraku.tw:/etc/nginx/ssl/hiraku.tw/private.key $folder/privkey.pem |
帳號跟網址自己換成你自己的,要注意的是,遠端的 private.key 在 NAS 應該要叫 privkey.pem,遠端的 fullchain.cer 在 NAS 要叫 fullchain.pem,並且複製一份叫 cert.pem。確定可以 scp 成功之後,最後我們要做自動化。
回到 DSM 的介面,選擇「控制台 → 任務排程表 → 新增 → 排程任務 → 使用者定義指令碼」,帳號選擇 root,排程時間自己設定,重點是指令碼,請改成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#!/bin/bash hash=$(cat "/usr/syno/etc/certificate/_archive/DEFAULT") folder="/usr/syno/etc/certificate/_archive/"$hash scp nas@connect.hiraku.tw:/etc/nginx/ssl/hiraku.tw/fullchain.cer $folder/cert.pem scp nas@connect.hiraku.tw:/etc/nginx/ssl/hiraku.tw/fullchain.cer $folder/fullchain.pem scp nas@connect.hiraku.tw:/etc/nginx/ssl/hiraku.tw/private.key $folder/privkey.pem if [ -d "/usr/syno/etc/certificate/ReverseProxy" ]; then cd /usr/syno/etc/certificate/ReverseProxy for D in *; do if [ -d "${D}" ]; then cp -rf $folder/* ./"${D}" fi done fi cp -rf $folder/* /usr/syno/etc/certificate/system/default/ #DSM 6 舊指令: synoservicectl --reload nginx #DSM 7 如下: synosystemctl restart nginx |
網址、路徑一樣要改成你自己的,儲存指令後馬上執行,如發現檔案有更新成功,那就 OK 了!
以上就是在 NAS 硬用遠端 linux wildcard SSL 憑證並自動更新的方法。
發佈留言