これまで有料の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サーバーに反映されるようになる。