macOS Serverでlaunchdを用いたLet's Encryptの更新

Feb. 9, 2019, 1:36 a.m. edited Feb. 12, 2019, 8:36 a.m.

#Let's Encrypt  #Mac 

既にcertbotを導入して,手動で証明書も取得できていて,あとは一定期間毎にcertbot renewするだけというところからスタート1

Macではcronよりもlaunchdを用いる方が良いとQiitaにあるが,調べてみると確かにそう書いてある2ので,今回はlaunchdを用いる.

まず,/Library/LaunchDaemons/my_certbot_renew.plistを作成し,ここに

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>my_certbot_renew</string>
    <key>Program</key>
    <string>/Library/LaunchDaemons/my_certbot_renew_script</string>
    <key>RunAtLoad</key>
    <true/>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Weekday</key>
        <integer>3</integer>
        <key>Hour</key>
        <integer>2</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <key>StandardErrorPath</key>
    <string>/Users/<ユーザ名>/my_certbot_renew_error.log</string>
    <key>StandardOutPath</key>
    <string>/Users/<ユーザ名>/my_certbot_renew_output.log</string>
</dict>
</plist>

と書く.ただし,<ユーザ名>にはあなたのユーザ名を入れる.これで毎週水曜日2時に/Library/LaunchDaemons/my_certbot_renew_scriptを実行するようになる.このときのログは/Users/<ユーザ名>/に出る.では,/Library/LaunchDaemons/my_certbot_renew_scriptには,

#!/bin/sh
/usr/local/bin/certbot renew --post-hook "env HOME=/Users/<ユーザ名> /usr/local/bin/brew services restart nginx"

と書く3.そしてsudo chmod +x /Library/LaunchDaemons/my_certbot_renew_scriptで実行権限を与える.それから,launchdに登録するためにsudo launchctl load /Library/LaunchDaemons/my_certbot_renew.plist

これでLet' Encryptの証明書が更新されるはずである.うまくいけば.


  1. 私はNginxの方が好きなので,Server.appは使わずにNginxを入れて,ここでLet's Encryptを導入した.certbotはbrewで入れた. 

  2. https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/ScheduledJobs.htmlの"Timed Jobs Using cron"にAlthough it is still supported, cron is not a recommended solution. It has been deprecated in favor of launchd.とあった. 

  3. ここで,env HOME=/Users/<ユーザ名>を入れないとcouldn't find HOME environment -- expanding `~'というようなエラーが出てしまう.