Let's Encryptでhttpsサーバを設定

Page content

info

  • ドメイン認証のSSLサーバ証明書が無料で発行できるサービス、というような感じ
  • SSL/TLSサーバ証明書の有効期間は90日間です
  • cronとか仕込めば自動更新できます
  • 運営者・運営組織の照明とはならない→お金を伴うビジネスには向かないだろう

installation

日本語公式のインストール手順 を見ながら実施 (以下は CentOS 6, Apache を想定)

  • インストールスクリプトは依存性あるパッケージを入れるため yum を使う。まずこれを入れておく

    $ sudo yum install epel-release
    
  • 続いてインストールスクリプトの取得と実行

    $ mkdir ~/www/letsencrypt/ && cd ~/www/letsencrypt/
    $ wget https://dl.eff.org/certbot-auto
    $ chmod a+x certbot-auto
    $ ./certbot-auto
    
  • 結果

    • apache は両方自動実行される
    • 複数 FQDN を指定可能。
    • 設定は /etc/httpd/conf.d/ssl.conf に書き込まれる
      ServerName <ドメイン1>
      ServerAlias <ドメイン2>
      ServerAlias <ドメイン3>
      SSLCertificateChainFile /etc/letsencrypt/live/<ドメイン1>/chain.pem
      
    • また、http を https に redirect するかどうか聞かれて、 yes と答えれば勝手に mod_rewriteを書いてくれる
    • /etc/httpd/conf.d/le-redirect-.conf
      <VirtualHost _default_:80>
      ServerName <ドメイン1>
      ServerAlias <ドメイン2> <ドメイン3>
      ServerSignature Off
      
      RewriteEngine On
      RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [L,NE,R=permanent]
      
      ErrorLog /var/log/httpd/redirect.error.log
      LogLevel warn
      </VirtualHost>
      

やった!

cronによる自動更新

証明書は90日という短い有効期限なので、更新を自動的にやってくれればらくちん。さらにslackにその結果を通知してくれると「お、やってるな」とわかって超らくちん。以下はそのためのscriptの例。

  1. まず cron スクリプトである cron.sh を作成
#!/bin/bash
SLACK_CHANNEL="#alerts"
SLACK_WEBHOOK_URL="<your_webhook_url>"
SLACK_USERNAME="letsencrypt_cron"

COLOR="#00CCCC"
YEAR=`date "+%Y" -d "-1 month"`
MONTH=`date "+%m" -d "-1 month"`


# Execute crowler
LE_LOG=`(/<path_to>/certbot-auto renew 2>&1)`

echo ${LE_LOG} | grep -q "No renewals were attempted."

if [ $? -eq 0 ]; then
  # Generate the JSON payload
  PAYLOAD="{
    \"channel\": \"${SLACK_CHANNEL}\",
    \"username\": \"${SLACK_USERNAME}\",
    \"attachments\": [
      {
        \"color\": \"${COLOR}\",
        \"fallback\": \"Let's Encrypt notification - No SSL cert renewed.\",
        \"pretext\": \":zzz: :scroll: Let's Encrypt notification - No SSL cert renewed\",
        \"fields\": [
          {
            \"title\": \"log\",
            \"value\": \"${LE_LOG}\",
            \"short\": \"false\"
          }
        ]
      }
    ]
  }"
else
  # Generate the JSON payload
  PAYLOAD="{
    \"channel\": \"${SLACK_CHANNEL}\",
    \"username\": \"${SLACK_USERNAME}\",
    \"attachments\": [
      {
        \"color\": \"${COLOR}\",
        \"fallback\": \"Let's Encrypt notification - SSL cert updated.\",
        \"pretext\": \":exclamation: :scroll: Let's Encrypt notification - SSL cert updated.\",
        \"fields\": [
          {
            \"title\": \"log\",
            \"value\": \"${LE_LOG}\",
            \"short\": \"false\"
          }
        ]
      }
    ]
  }"
fi

#Send message to Slack
curl -sX POST -o /dev/null --data "payload=${PAYLOAD}" $SLACK_WEBHOOK_URL 2>&1
  1. これを root の crontab に登録する(root証明書ファイル設置にroot権限が必要なため) crontab -e を実行して以下を登録
0 0 1 * * /<path_to>/cron.sh
  1. cli で試しに cron script を実行しておくとよい。 実行結果のイメージは以下。
  • 更新した場合: le_update.jpg
  • 更新不要だった場合: le_no-update.jpg