替Qnap控制台加上SSL

更新做法 2020-10-23
舊的方法執行 renew 後, 必須手動將 .well-known 的驗證檔案複製到 CentOs Web 目錄下來通過外部認證, 但後來想到其實可以直接透過 ProxyPass 的方式處理就好根本不用手動複製
首先啟用 Nas 的網站伺服器, 並建立一個虛擬主機, port 8080, 資料夾名稱直接指向到產生金鑰及驗證檔的程式目錄
我是放在 /Web/qnap-letsencrypt/tmp-webroot
然後原本用來作為對外 Web Server 的 CentOs Apache 則改成

ServerName mynas.domain.com
ProxyPass / http://192.168.1.xx:8080/
ProxyPassReverse / http://192.168.1.xx:8080/

所以到時候驗證檔案的時候, 就會直接連到 NAS 的虛擬主機, 這時候用來驗證的檔案當然也都能正常連結, 也就能自動更新 SSL 了


在我目前的版本 4.4.1 上
如果想替 NAS 後台加上 SSL 有兩種方法

  1. myQNAPcloud (最方便)
    它會直接配發一個 [yourname].myqnapcloud.com 的網址給你, 也能自動幫你加上 SSL
  2. 自己有網域名稱 (得在 SSL 到期前手動更新)
    在憑證與私人金鑰這, 選擇匯入或是從 Let's Encrypt 免費的第三方機構取得憑證

* 如果你選擇的是 Let's Encrypt 這個方式, 你必須一起把 NAS 內建的網站伺服器服務打開, 並且要在 Router 上設定 Port 80 指向到 NAS 本身所取得的內部 IP

我自己的使用情境是
在虛擬機內有台 CentOS Server, Router 上把 80 / 443 Port 都指向到這台 VM
在上面跑的網站都能掛上自己的網址, 申請免費 SSL 跟自動更新也都沒問題, 反正就是照一般的 Server 做法去處理
唯一的問題就出在 NAS 自己如果也想搭配自訂網域時
1. 我不想手動去更新憑證
2. 有 VM 的優先條件, 我並無法使用內建的網站伺服器, 就會導致第三方驗證失敗
所以衍生出我的這種方法
https://github.com/Yannik/qnap-letsencrypt
這是一隻能自動幫你的 QNAP 更新 Let's Encrypt 憑證的程式
當然它的使用情境是建立在上面提到的第二種方式上
我們直接看它的 renew_certificate.sh 程式碼

它會先停用 QNAP 的 HTTPD 服務, 然後啟用它內建的 HTTPServer
建立待會要用來驗證的路徑跟檔案
第三方授權中心做驗證
最後將取得的憑證替換掉 NAS 內建的
完成自動更新的目的

我的情境要稍微麻煩一點
執行程式前先將它裡面的 rm -rf tmp-webroot 註解掉, 因為我需要用它做好的驗證檔
第一次執行程式是會失敗, 接著到 CentOS 內的 Apache / Nginx 建立一組 virtualhost, 網址就是你要給 NAS 用的例如 mynas.domain.com
接著到它建立的暫存webroot, 把它建立好的驗證檔搬一份到虛擬機內, 這樣我們就完成接替它 web server 的動作了
第二次執行, 應該就能正確取得並替換 NAS 機用的金鑰

然後你的 NAS 就能使用 https://mynas.domain.com:port 連線

甚麼都要加上 SSL 是蠻累的