PHP 開發者使用 Let’s Encrypt 的好搭檔 — Acme PHP

以往使用 Let’s Encrypt 都是按 DK 長輩的 https://letsencrypt.tw 來做,隨著網站和主機越來越多,漸漸希望有個簡單的管理機制可用(至少要能看到憑證狀態);花時間找了幾個工具比較後,選了 Acme PHP,既是用 PHP 寫的又容易上手和整合;到現在使用半年多覺得還不錯,所以寫篇介紹文推廣一下。

安裝

基本上它就是一個 Phar(封裝起來的 PHP 檔)再加上 pubkey(驗證檔),你要用 wget 或官網說的 php -r "copy(....)" 抓下來都可以。建議先在 /etc 下建一個目錄

$ mkdir /etc/acmephp && cd /etc/acmephp
$ wget https://github.com/acmephp/acmephp/releases/download/1.0.0-beta4/acmephp.phar
$ wget https://github.com/acmephp/acmephp/releases/download/1.0.0-beta4/acmephp.phar.pubkey

下載後將 phar 改為可執行

chmod +x acmephp.phar

註冊

一行指令自動按照你的 Email 產出一組密鑰,並且同意 Let’s Encrypt 的條款

$ acmephp.php register youremail@example.com

申請憑證

按 Let’s Encrypt 的規則,申請前要先驗證網址 / 網域,Acme PHP 支援兩種驗證模式:一般(網頁)和 DNS

$ acmephp.php auth yourdomain.org

$ acmephp.php auth -s dns yourdomain.org

一般模式它會要求你在網站下建立 /.well-known/acme-challenge/ 並新增指定的文字檔案。

DNS 模式則是要求你新增 _acme-challenge.yourdomain.org 的 TXT 紀錄。

驗證網域

按照你選擇的設定方式來驗證

$ acmephp.php check yourdomain.org

$ acmephp.php check -s dns yourdomain.org

取得憑證

驗證成功後下 request 就可以拿回憑證了

$ acmephp.php request yourdomain.org

通常會放在 ~/.acmephp/master/{certs, private}/yourdomain.org/ 目錄下,有需要的話可以自己手動連過去

$ ln -s ~/.acmephp/master/certs /etc/acmephp/certs
$ ln -s ~/.acmephp/master/private /etc/acmephp/private

檢查憑證狀態

$ acmephp.php status

更新憑證

只要重新 request 一次就可以了。但如果你離憑證到期日超過七天以上,Acme PHP 自己會先把你踢掉

Loading account key pair…
Current certificate is valid until 2018–04–15 17:01:03, renewal is not necessary. Use — force to force renewal.

你可以手動加上 --force 強迫它去問 Let’s Encrypt 的主機,這點很重要,因為目前 Acme PHP 有個莫名的 Bug 必須用 --force 來避免。

多網域憑證

如果你要使用多網域憑證,例如 yourdomain.org 包含 sub.yourdomain.org ,第一步請先 個別驗證 這兩個網域(auth + check),然後在 request 時把子網域用 -a 掛上去(有多個網域就要多次 -a

$ acmephp.php request yourdomain.org -a sub.yourdomain.org

定時更新

時間決定好,在 crontab 裡下

/etc/acmephp/acmephp.php request yourdomain.org --force >> /var/log/acmephp.log && service nginx reload

已知問題

這些都是在講同一個問題…

如同上面所提到,Acme PHP 目前有一個已知 Bug:你如果按照它建議的時間(或被半強迫地遵守)來更新憑證,會因為網域驗證過期而導致更新憑證失敗,然後必須全部流程重新跑一次 auth -> check -> request;網站一多這真的是非常痛。

有人提到這是因為 Let’s Encrypt 的網域驗證時效,從 60 天縮短至 30 天 的關係,如果你要在到期前七天(或十天,Let’s Encrypt 自動 Email 通知的時間點)才重新請求憑證,是絕對來不及的。

所以才會建議,目前自動更新的部份要使用 --force 強迫 Acme PHP 問 Let’s Encrypt,可以的話就第一時間更新憑證狀態(並延長網域驗證時效)。

結論

Acme PHP 真的是個小巧方便的好用工具,雖然有 Bug 但是瑕不掩瑜,而且它是用 PHP 寫的,光是親切感就贏了(只是多個憑證狀態可以查看就覺得心裡頭舒坦啊…)。

快一起來幫你的網站加上 SSL 吧。