但是LINE bot要求的webhook網址必須是https
因此我們必須去申請一個SSL認證
這邊我使用免費的sslforfree服務來申請SSL認證
首先填入想要申請https的網址
接下來選擇Manual Verification
這個選項會要你下載認證用的檔案並放到網站上的特定路徑中,之後SSL for free會存取該網頁位置來確定你的確真的有架設這個網站
點選Manually Verify Domain
依照說明,下載認證用的檔案並且在網站根目錄下建立".well-known"與"acme-challenge"兩層目錄後,將認證檔案放到"acme-challenge"目錄下
在繼續下一步之前,先點選Step5的網址確定SSL for free能存取到我們放上去的認證用檔案
Oops!竟然會出現404找不到頁面。檢查過路徑與網址也都正確,為什麼會找不到檔案呢?
因為DSM中的web station沒有提供任何可供參考的資訊,
因此只能放大絕招 → 直接ssh遠端連線進NAS找log
首先先開啟NAS的SSH功能
DSM中點選控制台 → 終端機&SNMP → 啟用SSH功能
這裡考量到安全性,建議將SSH預設的22連接阜改掉
之後使用SSH軟體(如Putty等)就可以遠端連線到NAS裡面去了
登入時必須使用管理者群組的帳號才能夠ssh,密碼就跟登入DSM的一樣
登入後帳號的權限還是不太夠,這時候輸入
sudo -i來將帳號提升為root權限,再輸入一次該帳號的密碼
此時可以開始找web station的log了
log是在/var/log/nginx/裡面
因此我們輸入下面兩行來看log
cd /var/log/nginx/從log中間我們可以看到這樣的訊息
tail error.log
2017/01/03 22:36:54 [error] 29074#29074: *53904 open() "/var/lib/letsencrypt/.well-known/acme-challenge/4lzLK6f2KuCx7L-1wOQq_d8b57Ab3KtpYps0uyX2iII" failed (2: No such file or directory), client: 111.248.116.180, server: infobot.ddns.net, request: "GET /.well-known/acme-challenge/4lzLK6f2KuCx7L-1wOQq_d8b57Ab3KtpYps0uyX2iII HTTP/1.1", host: "infobot.ddns.net"網站試圖從"/var/lib/letsencrypt/.well-known/acme-challenge/"下去找檔案而非我們原先認為的"/volume1/web/sslServer/.well-known/acme-challenge/"
*註:原本的/web/是一個共享資料夾,其對應到NAS中的實體路徑是/volume1/web/
從log中我們發現很奇妙的一個事實,網站尋找認證檔案的路徑並非我們原先所想的路徑。
想來想去只有可能是網站伺服器nginx動了某些手腳。
現在我們去看看nginx的設定檔
nginx的設定檔路徑是 /etc/nginx/nginx.config
輸入以下指令來查看設定檔內容:
cd /etc/nginx/設定檔的內容很多,有些是關於DSM服務的。不過我們可以在設定檔尾端看到以下的設定:
cat nginx.config
location ^~ /.well-known/acme-challenge {的確在設定檔中有設定如果網址是"/.well-known/acme-challenge"的話就會改成找/var/lib/letsencrypt/下的路徑
root /var/lib/letsencrypt;
default_type text/plain;
}
現在真相大白了,凶手也抓出來了,那麼我們要怎麼解決遇到的問題呢?
目前的問題是當要存取"/volume1/web/sslServer/.well-known/acme-challenge/"時會被轉去存取"/var/lib/letsencrypt/.well-known/acme-challenge/"
如果可以讓網站存取"/var/lib/letsencrypt/.well-known/acme-challenge/"時如同存取"/volume1/web/sslServer/.well-known/acme-challenge/"的內容,那問題不就解決了嗎?
這時候我們可以使用linux的指令ln來達成我們的目的
首先先創建目錄letsencrypt
mkdir /var/lib/letsencrypt/建立檔案連結
ln -s /volume1/web/sslServer/.well-known/ /var/lib/letsencrypt/.well-known此時查看.well-known資訊
ll /var/lib/letsencrypt/這時就會顯示.well-known是連向"/volume1/web/sslServer/.well-known/"
.well-known -> /volume1/web/sslServer/.well-known/
至此問題應該都解決了,回到前面申請SSL的步驟。
此時點選steps 5的網址應該能正常開啟檔案
能正常開啟檔案後,繼續申請SSL的步驟,點選最下面的Download SSL Certificate
(註:如果你是跟著步驟一步一步做到這裡,此時產生SSL Cert時可能會顯示錯誤。這是因為驗證檔案從產生到開始驗證中間隔太久的關係。此時只要回到前面的步驟重新讓SSL for free產生一份新的認證用檔案即可)
正常產生出SSL cert之後,因為這個SSL cert只有90天的有效期限。
你可以註冊SSL for free的帳號,他會在SSL Cert快過期時通知你
頁面往下面捲動,選擇Download All SSL Certificate Files將憑證下載回來
這份檔案非常重要請一定要保存好
有了憑證後我們要匯入到NAS裡面去
回到DSM→控制台→安全性→憑證 →新增
選擇新增憑證後點下一步
之後選匯入憑證
匯入這邊,將之前下載的zip檔解壓縮
私鑰的部分選擇private.key
憑證選擇certificate.crt
之後按確定就好
此時可以看到憑證成功匯入。
現在我們點選設定來設定website使用憑證
將website指定成剛才匯入的憑證
此時就可以使用https開啟website了
請問一下
回覆刪除"建立檔案連結
ln -s /volume1/web/.well-known/ /var/lib/letsencrypt/.well-known"
輸入後會跑出
ln: failed to create symbolic link ‘/var/lib/letsencrypt/.well-known/.well-known’: File exists
是什麼原因?
從錯誤訊息"File exists"來看,表示.well-known早就已經存在,所以創造link時失敗。
刪除指令ln -s /volume1/web/.well-known/ /var/lib/letsencrypt/.well-known
實際上會在/var/lib/letsencrypt/裡建立.well-known,因此在建立link前letsencrypt路徑下不應該有.well-known
真的超感謝,我花了兩天時間找資料
刪除終於解決了😆
不客氣^^。我當初也是遇到各種奇妙的問題卡很久後才找出原因。
刪除寫文章就是希望能把經驗分享給其他人,讓大家不用卡在相同的問題上。
暈,居然中有最後一步,configure...激死,難怪一直唔得...
回覆刪除thx...
請問RT2600AC是否可以用同樣的方法認證憑證
回覆刪除你好。我沒有RT2600AC的產品,因此沒有辦法給你完整的解答,只能給你一個大致的嘗試方向。
刪除依據我找到的結果,SRM(RC2600AC的網頁管理介面)需要使用到SSL的是SSL VPN的功能。該功能可以1.匯入外部憑證 2.自我簽暑憑證。
這邊有兩個方案:
方案一:匯入外部憑證
SSL for Free可以使用CSR來申請ssl,因此大約的步驟是
1. 在SRM的憑證管理中選擇""建立憑證簽署請求(CSR)
2. 在SSL for Free網站,點選Manually Verify Domain之後,最下面會多出一個選想"I have my own CSR",把你的CSR內容貼上來
3. 一切順利之後應該就能拿到憑證檔,回到SRM中匯入即可。
方案二:使用自我簽暑憑證
你可以參考挨踢路人甲的文章
https://walker-a.com/archives/4073
謝謝你的解答
回覆刪除如果存取"/var/lib/letsencrypt/.well-known/acme-challenge/"時如同時存取"/volume1/web/sslServer/.well-known/acme-challenge/"的內容會有安全性風險嗎?
回覆刪除另,如何取消同時存取? 申請ssl cert之後取消同時存取會有影響? thx!
1. 關於安全性風險,我認為是沒有。因為我們有限縮目錄連結的範圍只有在"/var/lib/letsencrypt/.well-known/"之下,並沒有其他系統路徑。
刪除2. 要取消同時存取的話只要把link刪除即可,使用命令rm /var/lib/letsencrypt/.well-known
3. 這只有在申請時有用到,申請成功後就可以取消連結了
作者已經移除這則留言。
刪除作者已經移除這則留言。
刪除感謝你的回覆!
回覆刪除我在 這個步驟 ln -s /volume1/web/sslServer/.well-known/ /var/lib/letsencrypt/.well-known
回覆刪除覺得怪怪的似乎沒有正常建立連結 我把 /volume1/web/sslServer/.well-known/ 這段後面的 /刪除才正常
ca_bundle.crt 這個檔案是沒有用的?
回覆刪除我使用後 .well-known -> /volume1/web/sslServer/.well-known/ 成功了 但是後來要設定多個網站的SSL 比如說我有 web1server Web2server web3server 要怎麼讓他分別指向不同的目錄呢?
回覆刪除1. 本篇主要是使用SSL for Free來幫你申請SSL cert,不過DSM本身有做Let's Encrypt的整合,可以透過DSM來幫你申請SSL cert。
刪除2. 因為.well-known是在申請SSL以及3個月後做renew時才會需要存取此目錄,因此可以考慮3個網站在申請時都先暫時使用同一個目錄,申請成功之後在改回原本網站應該使用的目錄。
缺點是每3個月做renew時你都必須把網站的目錄都改過來,這可能會使得你的網站在這段期間是無法使用的。
3. 另外的方法就是讓你3個網站的目錄都用link指到/var/lib/letsencrypt/.well-known,也就是像這樣:
ln -s /volume1/web/web1server/.well-known/ /var/lib/letsencrypt/.well-known
ln -s /volume1/web/web2server/.well-known/ /var/lib/letsencrypt/.well-known
ln -s /volume1/web/web3server/.well-known/ /var/lib/letsencrypt/.well-known
不過使用ln本身就只是一個暫時解法(workaround),我認為不應該繼續套用這種解決方式在多個網站上。此外這也會增加維護的成本,下一個接手的人很有可能不知道你是使用這種方法才成功的申請到SSL cert。
綜合上述,我個人是建議使用方案1:DSM本身整合Let's Encrypt的功能。除非有其他考量才使用workaround的方式。
謝謝你 已經用 DSM 整合的 Let's Encrypt 設置成功 原來內建的也可以設定多網域
回覆刪除謝謝你 我還以為我的synology壞掉了 準備重灌呢
回覆刪除網誌管理員已經移除這則留言。
回覆刪除