Let’s EncryptのSSL/TLSサーバ証明書の取得と証明書の自動更新設定の手順をまとめてみる

2021.11.19

2021.11.19

Fabeee社員ブログ


こんにちは。

FabeeeのPM兼エンジニアのペコです。

WebサイトやWebサービスのSSL化というと、インフラエンジニアさんは朝飯前でちゃちゃっと対応してくれますが、がっつりアプリケーション側のエンジニアからすると意外と(?)この辺りの知識に疎かったりなんてことも多々あります。

ということで、無料のSSL/TLSサーバ証明書認証局であるLet’s Encryptの証明書を利用してSSL化対応する手順と、証明書の自動更新設定の方法をご紹介していきます。

はじめに

先日、Let’s Encryptの証明書でSSL化対応する作業があり、その作業自体は以前に経験があったので特に問題ないと思っていました。

ですがなにぶん数年前の話なので、ちゃんと最新情報を調べてみたところ、ペコが経験済みだったcertbot-autoを使用したやり方はすでに非推奨となっているとのこと…。

なので、自分用の手順書の作り直しも兼ねながらLet’s EncryptでのSSL化対応の手順をまとめます。

前提としている環境

今回の環境の前提は以下として進めていきます。

  • OSは CentOS 7
  • Webサーバは nginx

Let’s Encryptを利用するための準備

Let’s Encryptが現在推奨しているSnap版certbotを利用するため、まずはパッケージ管理システムであるSnapをインストールする必要があります。

EPELリポジトリとSnapのインストール

SnapはEPELリポジトリからダウンロードするので、前提としてEPELリポジトリをインストールしておきます。

$ sudo yum install epel-release
そしてEPELリポジトリからSnapのインストール。
 $ sudo yum --enablerepo=epel install snapd
インストールしたSnapの自動起動を有効化し、起動させます。
$ sudo systemctl enable --now snapd.socket

Classic Snapをサポートするために、下記のシンボリックリンクを作成しておきます。

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

次にcoreパッケージをインストール & アップデートします。

$ sudo snap install core 
$ sudo snap refresh core

なお、snap install core や snap refresh core を実行した際にエラーメッセージが出力される場合があります。

その際には何度か実行するか、1〜2分程度間をあけると問題なく成功するようです。

certbotのインストール

そしてSnapからLet’s Encryptクライアントであるcertbotをインストールし

$ sudo snap install --classic certbot

certbotコマンドを使いやすいよう、/usr/binの配下にシンボリックリンクを作成しておきます。

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
まずはここまでで、Let's Encryptから証明書を取得、更新するためのSnap版certbotのインストール作業は完了です。

Let’s Encryptで証明書を発行する

SSL/TLSサーバ証明書の取得

certbotをインストールしたら、下記コマンドからLet’s Encryptに証明書を発行してもらいます。

今回はWebサーバの設定ファイルは手動で変更するため、certonlyで証明書の取得処理のみを実行させます。

$ sudo certbot certonly -d example.com --preferred-challenges http --agree-tos --register-unsafely-without-email --nginx

ちなみに、各オプションの説明は以下のとおりです。

オプション 内容
-d ドメインを指定する
サブドメインなど、複数指定したい場合は
-d example.com -d foo.example.com -d bar.example.com
のように繰り返す
–preferred-challenges 認証方式を指定する
–preferred-challenges http の指定ではHTTP認証
–agree-tos 利用規約に確認メッセージなしで同意する
–register-unsafely-without-email メールアドレスを登録しない
登録したい場合は -m メールアドレス で指定する
(メールアドレスを登録すると、証明書の有効期限が迫ってきたらリマインダーメールが送られてくる)

コマンド実行後に

IMPORTANT NOTES: - Congratulations!
Your certificate and chain have been saved at: 〜
というメッセージが出力されていれば、証明書の発行と取得は無事成功です。

Let’s Encryptから取得したファイル

Let’s Encryptから取得した各ファイルは、下記で一覧確認することができます。

$ sudo ls -l /etc/letsencrypt/live/

それぞれのファイルは以下となっています。

ファイル名 種類
cert.pem 証明書
chain.pem 中間証明書
fullchain.pem 証明書+中間証明書
privkey.pem 秘密鍵

Webサーバの設定ファイルには、これらのファイルのうち必要なファイルのパスを指定します。

なお、nginxの場合は fullchain.pem と privkey.pem の2つを使用することになります。

ここまでで、SSL/TLS証明書をサーバ内に配置することができました。

SSL/TLSサーバ証明書の自動更新

グローパルサインなど有料の認証局の場合、一般的には年契約で証明書にも1年の有効期限が設定されていることが多いかと思いますが、Let’s Encryptの証明書の有効期限は90日間と短いです。

そのため、通年で運用する場合には年間で4回も証明書の更新をする必要があります。

Snap版certbotの証明書自動更新

以前はcronを利用して定期的にcertbotの証明書更新処理を実行させる方法がスタンダードでしたが、Snap版certbotでは自動更新機能が実装されています。

どのように処理の自動実行が実現されているかというと、今回の環境のOSであるCentOSでは、certbotの証明書更新処理(renew)がsystemdのタイマー機能に登録され、以下のコマンドから、実際に snap.certbot.renew.service が登録されていることが確認できます。

$ sudo systemctl list-timers | less

証明書更新処理はタイマーにより毎日実施されますが、certbotのrenewは証明書の有効期限が残り30日を切るまでは証明書の更新は行いません。

更新された証明書の反映

前述のようにサーバ証明書は自動的に更新されますが、新しい証明書が有効になるためにはWebサーバに適用される必要があります。

これは、certbotが証明書を更新した後に呼び出すシェルスクリプトでWebサーバをリロードすることで可能となります。

まず、/etc/letsencrypt/renewal-hooks/deploy ディレクトリに、例えば nginx-reload.sh という名前のファイルを格納します(ファイル名は任意です)。

このシェルスクリプトで、以下のようにWebサーバがリロードされるようにしておきます。

#!/bin/bash 
sudo systemctl reload nginx
また、ファイルパーミッションも変更しておきます。
$ chmod 755 /etc/letsencrypt/renewal-hooks/deploy/nginx-reload.sh
これで、certbotが実際にサーバ証明書を更新した後にWebサーバをリロードするシェルスクリプトである nginx-reload.sh が実行され、最新のサーバ証明書がWebサーバに適用されます。

おわりに

これでLet’s Encryptを利用したSSL/TLSサーバ証明書の取得と自動更新設定は完了となります。

手順としてメモしておけば、また別の環境に同様の設定を実施する時も安心ですね。

この記事が参考になったようであれば幸いです。

Fabeee編集部

Fabeee編集部

こちらの記事はFabeee編集部が執筆しております。