2017年1月4日 星期三

申請免費SSL認證

這台NAS上的網站是為了給LINE bot使用的network service
但是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/                                                                   
tail error.log                                                                           
從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/                                                                                                        
cat nginx.config                                                                                                    
 設定檔的內容很多,有些是關於DSM服務的。不過我們可以在設定檔尾端看到以下的設定:
 location ^~ /.well-known/acme-challenge {                                                    
            root /var/lib/letsencrypt;                                                                         
            default_type text/plain;                                                                          
        }                                                                                                                      
 的確在設定檔中有設定如果網址是"/.well-known/acme-challenge"的話就會改成找/var/lib/letsencrypt/下的路徑

現在真相大白了,凶手也抓出來了,那麼我們要怎麼解決遇到的問題呢?
目前的問題是當要存取"/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了

20 則留言:

  1. 請問一下
    "建立檔案連結
    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
    是什麼原因?


    回覆刪除
    回覆
    1. 從錯誤訊息"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

      刪除
    2. 真的超感謝,我花了兩天時間找資料
      終於解決了😆

      刪除
    3. 不客氣^^。我當初也是遇到各種奇妙的問題卡很久後才找出原因。
      寫文章就是希望能把經驗分享給其他人,讓大家不用卡在相同的問題上。

      刪除
  2. 暈,居然中有最後一步,configure...激死,難怪一直唔得...
    thx...

    回覆刪除
  3. 請問RT2600AC是否可以用同樣的方法認證憑證

    回覆刪除
    回覆
    1. 你好。我沒有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

      刪除
  4. 如果存取"/var/lib/letsencrypt/.well-known/acme-challenge/"時如同時存取"/volume1/web/sslServer/.well-known/acme-challenge/"的內容會有安全性風險嗎?
    另,如何取消同時存取? 申請ssl cert之後取消同時存取會有影響? thx!

    回覆刪除
    回覆
    1. 1. 關於安全性風險,我認為是沒有。因為我們有限縮目錄連結的範圍只有在"/var/lib/letsencrypt/.well-known/"之下,並沒有其他系統路徑。
      2. 要取消同時存取的話只要把link刪除即可,使用命令rm /var/lib/letsencrypt/.well-known
      3. 這只有在申請時有用到,申請成功後就可以取消連結了

      刪除
    2. 作者已經移除這則留言。

      刪除
    3. 作者已經移除這則留言。

      刪除
  5. 我在 這個步驟 ln -s /volume1/web/sslServer/.well-known/ /var/lib/letsencrypt/.well-known

    覺得怪怪的似乎沒有正常建立連結 我把 /volume1/web/sslServer/.well-known/ 這段後面的 /刪除才正常

    回覆刪除
  6. ca_bundle.crt 這個檔案是沒有用的?

    回覆刪除
  7. 我使用後 .well-known -> /volume1/web/sslServer/.well-known/ 成功了 但是後來要設定多個網站的SSL 比如說我有 web1server Web2server web3server 要怎麼讓他分別指向不同的目錄呢?

    回覆刪除
    回覆
    1. 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的方式。

      刪除
  8. 謝謝你 已經用 DSM 整合的 Let's Encrypt 設置成功 原來內建的也可以設定多網域

    回覆刪除
  9. 謝謝你 我還以為我的synology壞掉了 準備重灌呢

    回覆刪除
  10. 網誌管理員已經移除這則留言。

    回覆刪除