CentOS7 Nginx に Let’s Encrypt でサイトを SSL 化して SSL証明書の自動更新を設定する

シェアする

CentOS7 Nginx に Let’s Encrypt でサイトを SSL 化して SSL証明書の自動更新を設定します。

サイトを SSL 化するのが当たり前の時代になってきました。

Chrome は近い将来、SSL 化していないサイトを閲覧したい際に、アドレスバーで警告を表示するようです。SEO の観点では、検索結果を優遇するという話で、さらに、サイトの高速化にもなるということです。

今年からワイルドカード SSL証明書の発行も始めました Let’s Encrypt。今後、需要はますます高くなっていくでしょう。

CentOS7 + Apacheの環境にLet’s Encryptをインストールする方法ついて紹介しています。
Google Cloud DNS + Let's Encrypt でワイルドカード SSL 証明書を取得します。 ワイルドカード SSL 証明書とは、1つの SSL 証明書を、複数のサブドメインで共有できる、SSL 証明書です。 例えば、leben.mobi のワイルドワード SSL 証明書を取得した場合、その SSL 証明書は、www.leben.mobi でも使えますし、mail.leben.mobi でも ftp.leben.mobi でも使えます。サブドメインが複数ある場合は、それぞれで1つずつ取得するより、ワイルドカードの1つでいいので管理が楽です。

バージョン

  • CentOS 7.4
  • epel-release 7-11
  • certbot 0.24.0
  • Nginx 1.12.2-2

インストール

certbot

$ sudo yum install -y epel-release
$ sudo yum install -y certbot

Let’s Encrypt の SSL 証明書を発行や更新するための certbot をインストールします。

CentOS7 の場合、certbot は EPEL に用意されていますので、まず、EPEL リポジトリをインストールします。

Nginx

$ sudo yum install -y nginx

サイトを SSL 化するための Web サーバーは、Nginx を使いたいと思います。
CentOS 7 の場合、こちらも certbot 同様に EPEL に用意されています。

Nginx の設定

server {
    listen 80;

    server_name leben.mobi;

    location ^~ /.well-known/acme-challenge/ {
        root /var/www/letsencrypt;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;

    server_name leben.mobi;

    access_log /var/log/nginx/leben.mobi_access.log main;
    error_log /var/log/nginx/leben.mobi_error.log warn;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_certificate /etc/letsencrypt/live/leben.mobi/fullchain.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/leben.mobi/chain.pem;
    ssl_certificate_key /etc/letsencrypt/live/leben.mobi/privkey.pem;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Protocol $scheme;

    location ^~ /.well-known/acme-challenge/ {
        root /var/www/letsencrypt;
    }

    location / {
        ...
    }
}
Nginx の設定ファイルです。Let’s Encrypt 用に、/.well-known/acme-challenge/ の root 任意のディレクトリに指定しておきます。
上記の例は、leben.mobi(このブログ)のドメインを使用した際のものです。

SSL 証明書を取得

certbot certonly

$ sudo certbot certonly --webroot -n --agree-tos -m Your E-Mail -w /var/www/letsencrypt/ -d leben.mobi

SSL 証明書の取得コマンドです。このコマンドを実行すると、出力がたくさん出てきます。最後の方で、Congratulations! と出れば取得できたことになります。

certbot が認証するために、w オプションで、先ほど Nginx で設定した root のディレクトリを指定します。

メールアドレスは SSL 証明書が更新できない状態になった時などに、Let’s Encrypt から通知を受け取ることができます。

SSL 証明書の自動更新

renew post hook

$ sudo sed -i -e "s/^POST_HOOK=\"\"/POST_HOOK=\"--post-hook 'systemctl restart nginx'\"/" /etc/sysconfig/certbot

certbot は、SSL 証明書を自動更新した時のフックポイントをいくつか用意しています。

/etc/sysconfig/certbot の POST_HOOK を編集し、SSL 証明書を自動更新した後に Nginx を再起動し、SSL 証明書更新を Nginx に反映します。

certbot-renwe.timer

$ sudo systemctl enable --now certbot-renew.timer
Created symlink from /etc/systemd/system/timers.target.wants/certbot-renew.timer to /usr/lib/systemd/system/certbot-renew.timer.

certbot に SSL 証明書を自動更新させるために、certbot-renew.timer を有効にします。これで、certbot が有効期限が近くなった証明書を自動更新してくれます。

cron でやる方法もありますが、CentOS7 で EPEL リポジトリの certbot パッケージを利用している場合、certbot-renew.timer が付いていますので、こちらを利用しましょう。

まとめ

CentOS7 Nginx に Let’s Encrypt でサイトを SSL 化して SSL 証明書の自動更新を設定しました。

Let’s Encrypt を導入する前は、苦戦すると思っていたのですが、特につまづく箇所はなく、サクッと導入できました。SSL 化はたくさんのメリットがありますし、Let’s Encrypt は簡単なので、まだの人は、これを機に挑戦してみてください。この記事が参考になれば幸いです。