在 Synology NAS 上設定 Let's Encrypt 憑證

Let’s Encrypt Beta Problem

2016.05.09 Update: Synology DSM 6.0 發佈之後,就已內建整合 Let’s Encrypt 憑證的申請、更新及管理,在多個 domains, virtual hosts 也可以成功運作,更加方便。

2016.01.28 Update: 現在有一個非官方但更方便的工具 – letsencrypt.sh,它是 BASH script,只需要一些大部份機器上都有的 command line tools 就可以執行,在 Synology NAS 上也可以成功的取得憑證,方法請參見:在 Synology NAS 上用 Shell Script Renew Let’s Encrypt

Let’s Encrypt 是一個最近新興的 certificate authority (CA), 他們的一個宏高的理想是 “encrypt the entire web”,提供免費的 SSL 憑證,在幾天前,他們開始了 Beta Program填個資料就可以參加,我收到確認信後,也試著安裝了一下。

和一般的 CA 不同(例如之前申請過的 StartSSL),不是透過 web 來下載,他們提供了一個 python script 讓使用者可以方便的取得憑證,但在 Synology NAS 上並沒有辦法成功的安裝與執行,參考了 mgoerges 的做法,透過另一台機器取得後,再 import 進 DSM 中,以下簡要的記錄一下步驟:

Synology NAS 上的準備

在 vhost 的目錄下(或是另建一個讓 Let’s Encrypt 暫時用的目錄),

$ mkdir -p .well-known/acme-challenge

要暫時讓出 domain 的 http 連線,原本有 mod_rewrite 導到 https 的部份要取消,或是新增繞過 .well-known/acme-challenge 的 rule,有設 HSTS 的也要先取消。另一個做法是把 domain 的 ip 改到另一台機器上,但這樣會連原本還可以運作的 https 連線也會暫時中斷,所以就不採用這種作法。

用另一台 Linux 進行 script

為了讓 python script 可以順利執行,我找了另一台 Linux server (下稱 L), 上面跑的是 Ubuntu 14.04.1。

$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
$ ./letsencrypt-auto --agree-dev-preview --server https://acme-v01.api.letsencrypt.org/directory certonly -a manual

安裝程式會要求輸入 domain 和同意記錄 IP 位址,之後回到 Synology NAS 上,在 domain 所在路徑下建立一個有特定字串內容的檔案 .well-known/acme-challenge/#{hash_file_name},例如:

Make sure your web server displays the following content at
http://tsai.it/.well-known/acme-challenge/aFQ0LDDkn75K3LmvCIUvEYwq2Op1s9-ullGSwjsh0Is before continuing:

aFQ0LDDkn75K3LmvCIUvEYwq2Op1s9-ullGSwjsh0Is.ONcckxWtBH9uUepl5Eo_BMJHTng23yAdFJ_jVtfSNLg

Content-Type header MUST be set to text/plain.

如果透過 Synology NAS 上的 Apache,預設的 header 就是 text/plain, 不需特別調整。建立完後,回到 L 再繼續下一步。

如果可以成功驗證這個檔案後,script 會自動產生下面四個 certificates 檔:

/etc/letsencrypt/live/${domain}/privkey.pem
/etc/letsencrypt/live/${domain}/cert.pem
/etc/letsencrypt/live/${domain}/chain.pem
/etc/letsencrypt/live/${domain}/fullchain.pem

另外,Beta Program 也會提醒:

IMPORTANT NOTES:
– Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/tsai.it/fullchain.pem. Your cert will expire
on 2016-02-05. To obtain a new version of the certificate in the
future, simply run Let’s Encrypt again.

在 DSM 上匯入 Certificates

如果要用做整個 Synology NAS 的憑證,可以直接用 DSM 的 GUI 來匯入,將 privkey.pem, cert.pem, chain.pem 上傳即可。

如果要設多個 vhost 的 certificates, DSM 沒有介面可以設定,要直接改設定檔 /etc/httpd/sites-enabled-user/httpd-ssl-vhost.conf-user

在所屬的 ServerName 下加入:

SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/privkey.pem
SSLCertificateChainFile /path/to/chain.pem

缺點是每一次有動過 DSM 的設定,就得要重設並重啟 httpd,有點小麻煩。

照目前的 Beta 計劃,三個月後要 renew 憑證,再執行一次 script 驗證身份即可。暫時可以不需要 CloudFlare 提供的 SSL,如果還是要用他們的 CDN 服務,也可以改用 Strict Mode 來達到更好的安全性。