日記

日々のことと、Python/Django/PHP/Laravel/nodejs などソフトウェア開発のことを書き綴ります

let's encrypt の証明書発行モードを変更してみた

let's encrypt の証明書更新

この前の記事で、 let's encrypt の証明書更新を試しました。 しかし、standalone モードでの証明書の更新だったため、本来ホスティングしている Web サーバを止める必要があったりとイケてない状態でした。

証明書を Web サーバに再読込させる時間は仕方ないとしても、正直ダウンタイムは短くしたいですよね。そんなわけで、standalone から webroot に更新方法を変更してみたいと思います。

authenticator の変更と webroot 設定の追加

let's encrypt は証明書を最初に作った時の設定を /etc/letsencrypt/renewal/ 以下に保存してます。

前々回のエントリで作成した設定は /etc/letsencrypt/renewal/test.tnamao.net.conf として保存されていました。

この設定ファイルを書き換えることで、 standalone から webroot への変更ができます。変更内容は以下の設定です。

[renewalparams] セクション

  • authenticator を standalone から webroot に変更
  • standalone を True から False に変更
  • webroot を False から True に変更

webroot_map セクション

  • test.tnamao.net = /home/ubuntu/letsencrypt_webroot を追加

変更前後の diff

$ diff /etc/letsencrypt/renewal/test.tnamao.net.conf /etc/letsencrypt/renewal/test.tnamao.net.conf.bak 
22c22
< authenticator = webroot
---
> authenticator = standalone
25c25
< func = <function renew at 0x7f7bb6796938>
---
> func = <function renew at 0x7fac33dc47d0>
29c29
< standalone = False
---
> standalone = True
69c69
< webroot = True
---
> webroot = False
75d74
< test.tnamao.net = /home/ubuntu/letsencrypt_webroot

nginx の設定変更

nginx の webroot ディレクトリを使えば設定変更は不要です。

が、webroot ディレクトリはコード管理され、rsync などで同期されていることも多いので、let's encrypt が webroot 更新で使う部分だけを別のディレクトリに設定します。 server ディレクティブに以下の設定を追加します。

        location /.well-known/ {
            root /home/ubuntu/letsencrypt_webroot;
        }

使っている環境によっては、巧く行かないかもしれませんが、良きに計らって設定を追加をしてください。

この .well-known というディレクトリが let's encrypt の webroot モードで使用する URL 及び、ディレクトリ名となります。自動では letsencrypt_root ディレクトリは作られないので、予め作っておきます。 

ちなみにコンテンツの root は、こんな感じで設定されてます。

        location / {
            root   html;
            index  index.html index.htm;
        }

そして再起動

$ sudo supervisor restart nginx
nginx: stopped
nginx: started

これで let's encrypt 用のディレクトリ設定が反映されました。

実際に証明書を更新してみる

standalone で更新するときにあれこれオプションを付けていましたが、今回は色々と省略します。

$ ./letsencrypt-auto renew --force-renewal
Checking for new version...
Requesting root privileges to run letsencrypt...
   sudo /home/ubuntu/.local/share/letsencrypt/bin/letsencrypt renew --force-renewal
Processing /etc/letsencrypt/renewal/test.tnamao.net.conf
new certificate deployed without reload, fullchain is /etc/letsencrypt/live/test.tnamao.net/fullchain.pem

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/test.tnamao.net/fullchain.pem (success)

なんとこれだけ。--standalone や --webroot を指定しない場合は、/etc/letsencrypt/renewal/ 以下にある設定を読み取って、良きに計らってくれるようです。

では、nginx の再起動。standalone の時のように一度止めている訳では無いので次のコマンドで

$ sudo nginx -s reload

確認のため、ブラウザでアクセスしてみると…

f:id:monajiro:20160315012934j:plain

無事に更新できました!\(^o^)/

まとめ

let's encrypt には色々な authenticator が用意されているので、場面にあったものを選びましょう。 証明書更新の自動化をしたい場合は、webroot など Web サーバを止める必要が無いものを選び、crontab などで更新できるように用意しておくと良いのかもしれません。 自動化した時には実行結果をメールなりアラートなりで、通知するようにしておけば、万全そうです。

図らずも、3 回も let's encrypt ネタを書いちゃったけど、カテゴリを作れば良かったかな。