これまで有料のSSL証明書を購入して、SSLの設定をおこなってきたのだが、先日仕事で扱っているVPSで初めてLet’s Encryptの設定をおこなったので、その手順を備忘録としてまとめておく。

要件と事前準備

今回のサーバー要件は以下のとおり。

  • OS: CentOS7
  • Webサーバー: Apache2.4
  • 本ドメイン: hoge.com
  • SSLを設定するドメイン: dev.hoge.com

hoge.comは別の有料証明書でSSL設定がされており、今回はサブドメインのdev.hoge.comにLet’s Encryptを設定する例を紹介する。

また、事前準備としてDNSでサブドメインのAレコードを設定し、dev.hoge.comから今回設定するサーバーにアクセスできるようにしておく。

Snapのインストールと初期設定

Let’s Encrypt証明書の作成ツールである「certbot」は、最近では「Snap」でインストールすることが推奨されており、まずはsnapdをインストールする。

snapdはEPELリポジトリからインストールする必要があるため、EPELが入っていなければはじめにインストールしておく。

yum install epel-release

EPELの用意ができたら、snapdをインストールする。

yum --enablerepo=epel install snapd

snapdの自動起動設定と、サービスの起動。

systemctl enable --now snapd.socket

シンボリックリンクの作成。

ln -s /var/lib/snapd/snap /snap

coreパッケージのインストールとアップデート。

snap install core
snap refresh core

※インストール時にエラーが発生する場合の解決法はこちら。

Let’s Encryptクライアントのインストール

Snapのcertbotコマンドを使って、Let’s Encryptクライアントをインストールする。

snap install --classic certbot

シンボリックリンクの作成。

ln -s /snap/bin/certbot /usr/bin/certbot

Apacheの設定

まず、認証用ファイルを設置するためのディレクトリを用意。

mkdir -p /var/www/certbot/dev.hoge.com

次に、新たにconfファイルを作成し、バーチャルホストの設定を記述する。

vim /etc/httpd/conf.d/dev.hoge.com.conf

<VirtualHost *:80>
    DocumentRoot /var/www/dev.hoge.com
    ServerName dev.hoge.com
 
    Alias /.well-known /var/www/certbot/dev.hoge.com/.well-known
 
    <Directory /var/www/certbot/dev.hoge.com>
        Require all granted
    </Directory>
</VirtualHost>

ファイルを保存したら、confファイルの文法チェックをおこない、問題なければリロードして設定を反映させる。

httpd -t
systemctl reload httpd

Let’s Encrypt証明書の取得

certbotを使って証明書を取得する。

/usr/bin/certbot certonly \
    --webroot \
    -w /var/www/certbot/dev.hoge.com \
    -d dev.hoge.com \
    --preferred-challenges http \
    --agree-tos \
    -m mail@hoge.com

上記は一つの実行コマンドだが、バックスラッシュによる改行で見やすくしている。

各オプションについて解説しておこう。

--webrootはWebサーバーを起動したまま認証をおこなうためのオプションで、-wで認証時のドキュメントルートを指定している。

-dはドメインの指定、--preferred-challenges httpは認証方式の指定で、今回はhttp認証としている。

–agree-tosは利用規約への同意を表し、このオプションを付けると確認画面が表示されなくなる。

最後の-mはLet’s Encryptに登録するメールアドレスだ。

なお、一つの証明書で複数ドメインに対応させたい場合は、-w-dオプションを以下のように繰り返し記述すればよい。

/usr/bin/certbot certonly \
    --webroot \
    -w /var/www/certbot/dev.hoge.com \
    -d dev.hoge.com \
    -w /var/www/certbot/dev.fuga.com \
    -d dev.fuga.com \
    --preferred-challenges http \
    --agree-tos \
    -m mail@hoge.com

証明書の取得に成功したら、/etc/letsencrypt/live/dev.hoge.com/ディレクトリ内に以下のファイルが作成されているはずだ。

  • cert.pem(証明書)
  • privkey.pem(秘密鍵)
  • chain.pem(中間証明書)
  • fullchain.pem(証明書+中間証明書)

証明書の内容を確認するコマンド

作成された証明書はopensslコマンドで発行日や有効期限などの情報を確認することができる。

openssl x509 -text -noout -in /etc/letsencrypt/live/dev.hoge.com/cert.pem

ApacheのSSL設定

SSL設定用のconfファイルを作成し、バーチャルホストの設定をおこなう。

vim /etc/httpd/conf.d/ssl_dev.hoge.com.conf

<VirtualHost *:443>
    DocumentRoot /var/www/dev.hoge.com
    ServerName dev.hoge.com

    <Directory /var/www/certbot/dev.hoge.com>
        Require all granted
    </Directory>

    SSLCertificateFile /etc/letsencrypt/live/dev.hoge.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/dev.hoge.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/dev.hoge.com/chain.pem
</VirtualHost>

confファイルの文法チェックをおこない、Apacheを再起動して設定を反映させる。

httpd -t
systemctl restart httpd

常時SSLの設定

常時SSLの設定は.htaccessでも可能だが、ここではバーチャルホストの設定ファイル内でおこなう方法を紹介する。

vim /etc/httpd/conf.d/dev.hoge.com.conf

<VirtualHost *:80>
    # 以下を追記
    RewriteEngine on
    RewriteRule ^/(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
</VirtualHost>
vim /etc/httpd/conf.d/dev.hoge.com.conf

<VirtualHost *:443>
    # 以下を追記
    Alias /.well-known /var/www/certbot/dev.hoge.com/.well-known
</VirtualHost>

confファイルの文法チェックをおこない、リロードして設定を反映させる。

httpd -t
systemctl reload httpd

ここまでの設定が完了したら、ブラウザからhttps://dev.hoge.comへアクセスすると、SSL対応したページが表示されるはずだ。

Let’s Encrypt証明書の自動更新設定

Let’s Encrypt証明書の有効期間は90日間となっているため、有効期限が近づいたら証明書の更新をおこなわなければならない。

ここからは証明書の更新を自動でおこなうようにする設定方法を紹介する。

サーバー再起動スクリプトの作成

Snap版certbotはデフォルトで、証明書を自動更新する機能が付いている。

しかし自動更新はあくまで証明書の更新のみとなっているので、証明書を使っているWebサーバーに新しい証明書を反映させなければならない。そのための設定が別途必要となる。

vim /etc/letsencrypt/renewal-hooks/post/web_restart.sh

#!/bin/bash
systemctl reload httpd

作成したファイルのパーミッションを変更。

chmod 755 /etc/letsencrypt/renewal-hooks/post/web_restart.sh

こうしておくことで、証明書が更新されたタイミングで上記で設定したリロードコマンドが実行され、すぐに新しい証明書がWebサーバーに反映されるようになる。