KITA Eng.

北海道でサーバー技術者として歩み出したひとが綴るblog。

Let's EncryptのSSL証明書を自動更新して、結果をメール通知するスクリプトを書いてみた(WEBROOT、NGINX用)

2015/12/03にパブリックベータ版になったLet's Encrypt。以下のように掲げられているような理念だそうですね。

Let's Encrypt は、認証局(CA)として「SSL/TLSサーバ証明書」を無料で発行するとともに、証明書の発行・インストール・更新のプロセスを自動化することにより、TLSHTTPSTLSプロトコルによって提供されるセキュアな接続の上でのHTTP通信)を普及させることを目的としているプロジェクトです。( Let's Encrypt 総合ポータル )

内部的に使うシステムとかだと、自己証明書(オレオレ証明書とかいう)でもいいんでしょうけど、それなりに大きな組織が使うのにオレオレ証明書なのってどうなんだってのがあったりなかったりした記憶があります。

最近使い始めたSoft Ether VPN Serverとかだと、Soft Ether VPN Clientをいれればオレオレ証明書でも怒られませんが、Windows10とかiPhoneの標準装備VPNクライアントでつなごうとすると、オレオレ証明書だとつなげませんでした。なんか回避策はあるのかもしれませんが…。

そんなときには、結構便利なサービスになるんだろうなと思いますが、証明書の有効期限が90日間というのがネックです。といっても、ほんの1行のコマンドで取得、更新、廃止ができるようにするのが到達点のようなので、更新の自動化さえしてしまえば、有効期限が短いのは大した問題ではないのですが、パブリックベータがスタートした段階では、自動化をどうするかのHow toは公式さんにはありませんでした。が、今日のぞいてみたらシンプルなスクリプトが紹介されていました

前置きが長くなりましたが、証明書を更新し、更新結果をメール通知までしてくれるようにちょとスクリプトを書いてみましたよって話です。

前提として…

そもそも、Let's Encryptってなんだよとか、どうやって導入するんだよということは、以下のページにわかりやすくまとまっているので、こちらを参考にしましょう。

blog.apar.jp

初回取得後以降の自動更新スクリプト

公式さんのスクリプトを大改造!?して、証明書の更新処理、WEBサーバーの再起動(更新した証明書を読み込ませる)、結果をメール通知してくれるスクリプトを書きました。

29~33行目の設定部分を環境に合わせて修正してください。

# CONFIGER SECTION #----------------------------------------------------------#

readonly CMD_PATH=/usr/local/letsencrypt
readonly LOG_FILE=/var/log/letsencrypt/renew.log

readonly SERVER_RESTART_CMD='/etc/init.d/nginx restart'   # After update CA, How to restart WEB Server?
                                                          # Default set is for NGINX

readonly CN="exsample.com"                   # Your Common Name for CA
readonly WEB_ROOT_PATH=/var/www/html   # WEB ROOT Path 
readonly MAIL_TO="root"                      # Mail to update result.
                                             # Default set is Local USER ROOT!

#-----------------------------------------------------------------------------#

こいつを、cronで毎月とか2か月に1回動かしてやればOKです。

cronの設定例(2か月に1回、15日の午前3:05に実行する)

5 3 15 */2 *    root    if [ -x /root/bin/ letsencrypt_cert_autoupdate_webroot.sh ]; then /root/bin/ letsencrypt_cert_autoupdate_webroot.sh; fi 

うまく更新できたときには、こんなメールが届きます。

    Subject: [Let's Encrypt Auto Update] Update Report for exsample.com
    Date: Sun, 31 Jan 2016 12:54:22 +0900 (JST)
    From: root <root@mx.exsample.com>
    To: root@mx.exsample.com

    # Let's Encrypt Cert autopudate Start: 2016-01-31-Sun-12:54:02
    # Update Log START --------------------------------------------------------------#
    Updating letsencrypt and virtual environment dependencies......
    Requesting root privileges to run with virtualenv: /root/.local/share/letsencrypt/bin/letsencrypt certonly --renew-by-default --webroot -w /var/www/html -d exsample.com
    IMPORTANT NOTES:
    - Congratulations! Your certificate and chain have been saved at
    /etc/letsencrypt/live/exsample.com/fullchain.pem. Your cert will
    expire on 2016-04-30. To obtain a new version of the certificate in
    the future, simply run Let's Encrypt again.
    - If you like Let's Encrypt, please consider supporting our work by:

    Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
    Donating to EFF: https://eff.org/donate-le


    # WEB SERVER RESTART LOG START ------------------------------#
    * Restarting nginx nginx
    ...done.
    #---------------------------- WEB SERVER RESTART LOG END ---#
    #------------------------------------------------------------- Update Log END ---#
    # Let's Encrypt Cert autopudate End: 2016-01-31-Sun-12:54:22