LinuxでLet’s EncryptのSSL証明書を取得・更新する方法

LinuxでLet’s EncryptのSSL証明書を取得・更新する方法

Linux環境などでWebサーバー用にSSサーバーL証明書を取得する場合、無料で取得できるLet’s Encryptが定番となっています。

そこでここでは、RedHat互換のAlmaLinuxでcerbotコマンドを使ってLet's EncryptのSSL証明書を取得したり、(手動)更新する方法を紹介します。

SSL証明書を取得する

Let's EncryptのSSL証明書を取得するときは、まず証明書を取得するのに必要なツールをインストールします。

# dnf -y install epel-release
# dnf -y install --enablerepo=epel certbot

次にcertbotコマンドでSSL証明書を取得します。

シングルドメインのSSL証明書

certbotコマンドでシングルドメインのSSL証明書を取得するときは、stadaloneプラグインを使った方法、webrootプラグインを使った方法、DNS認証を使った方法が用意されていますが、通常はstadaloneまたはwebrootを使って取得します。

ApacheやNginxといったWebサーバー用ソフトをまだ導入していない環境では、stadaloneプラグインを指定するとこで、certbot自身が備えているWebサーバー機能を使ってSSL証明書を取得できます。

なお、stanaloneではHTTP(80番ポート)を使って通信が行われるため、既にWebサーバーが稼働しており80番ポートが利用されている場合は、事前に停止しておきます。

# certbot certonly --standalone -d example.com -d www.example.com

すでにWebサーバーが稼働している環境では、webrootプラグインを使ってWebサーバーを止めずにSSL証明書を取得できます。

# certbot certonly --webroot -w /var/www/wordpress -d example.com -d www.example.com --agree-tos

コマンドを実行すると、処理経過が表示され最終行あたりにの「IMPORTANT NOTES:」に「Congratulations!」と表示されたら証明書の取得完了です。

取得した証明書は、下記の場所に保存されます。

  • サーバ証明書(公開鍵)
    実体:/etc/letsencrypt/archive/ドメイン名/certX.pem
    シンボリックリンク:/etc/letsencrypt/live/ドメイン名/cert.pem
  • 中間証明書
    実体 : /etc/letsencrypt/archive/ドメイン名/chainX.pem
    シンボリックリンク : /etc/letsencrypt/live/ドメイン名/chain.pem
  • サーバ証明書と中間証明書が結合されたファイル
    実体 : /etc/letsencrypt/archive/ドメイン名/fullchainX.pem
    シンボリックリンク : /etc/letsencrypt/live/ドメイン名/fullchain.pem
  • 秘密鍵
    実体 : /etc/letsencrypt/archive/ドメイン名/privkeyX.pem
    シンボリックリンク : /etc/letsencrypt/live/ドメイン名/privkey.pem

※ Xは取得した回数

SAN対応のSSL証明書

Let's Encryptでは、「example.com」と「example1.com」といった複数ドメイン名を指定したSAN対応のSSL証明書を取得できます。

たとえば、standaloneプラグインを使ってSAN対応のSSL証明書を取得するときは、以下のように「-d」オプションに続けて必要なドメイン名をすべて指定してコマンドを実行します。

# certbot certonly --standalone -d example.com -d example1.com -d example2.com

すでに「example.com」というSSL証明書を取得しており、後から証明書に「example1.com」というドメインを追加したい場合は、次のようにコマンドを実行します。

# certbot certonly --force-renew --cert-name example.com -d example.com -d example1.com

SAN対応のSSL証明書では、証明書の「サブジェクト代替名」フィールド欄に、証明書発行時に指定したドメイン名が列挙されています。

ワイルドカードのSSL証明書

Let's Encryptでは、複数のサブドメインに対応できる「*.example.com」といったワイルドカードを指定したSSL証明書を取得できますが、DNS認証での発行にのみ対応しています。

たとえば、example.comとそのサブドメインに対応したワイルドカードのSSL証明書を発行したいときは、次のようにコマンドを実行します。

# certbot certonly --manual --preferred-challenges dns-01 -d example.com -d '*.example.org' 

コマンドを実行すると、DNSサーバーにTXTレコードを追加するよう指示が表示されるので、指示された内容を、example.comのレコードを登録しているDNSサーバーに追加することで認証が行われ、認証が成功すると証明書が発行されます。

なお、DNS認証を使って取得したSSL証明書は、以下で紹介している自動更新はできないのでご注意ください。

SSL証明書を更新する

自動更新

Let's EncryptのSSL証明書の有効期限は90日と短いため、通常は自動更新設定を行います。

SSL証明書を自動更新するときは、certbotのtimer設定を以下のコマンドで有効化します。

# 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.

次に、SSL証明書が更新される際に、Webサーバーのサービスを自動的に停止/起動させたり、再起動させるための設定を行います。

SSL証明書をstandaloneプラグインを使って取得した場合は、更新処理もstandaloneプラグインが使われるようなので、更新前にWebサーバーのサービスを停止して、更新後にWebサーバーのサービスを開始するよう設定します。

# vi /etc/sysconfig/certbot
PRE_HOOK="--pre-hook 'systemctl stop nginx'"
POST_HOOK="--post-hook 'systemctl start nginx'"

webrootプラグインを使って取得した場合は、更新処理もwebrootプラグインが使われるようなので、更新後にWebサーバーのサービスを再起動するよう設定します。

# vi /etc/sysconfig/certbot
POST_HOOK="--post-hook 'systemctl restart nginx'"

設定が完了したら、以下のコマンドでtimer設定を表示し、certbot-renew のNEXT欄に起動予定時刻が入っていることを確認します。

# systemctl list-timers
NEXT                        LEFT          LAST                        PASSED  UNIT                ACTIVATES
火 2018-03-27 02:37:27 JST 1h 32min left 月 2018-03-26 01:47:26 JST 23h ago certbot-renew.timer certbot-renew.service

SSL証明書の自動更新処理の結果は、次のコマンドで確認できます。

# journalctl -u certbot-renew

なお、更新時に利用するプラグインは設定ファイル「/etc/letsencrypt/renewal/example.com.conf」で変更することもできます。(手順は割愛します。)

手動更新

何らかの事情で、SSL証明書を手動更新したいときは、以下のコマンドを実行することで、期限まで30日未満の証明書を更新できます。

SSL証明書をstandaloneプラグインを使って取得した場合は、Webサーバーのサービスを停止してから以下のコマンドを実行します。

# certbot renew

期限までに30日以上の猶予がある場合に、強制的にSSL証明書を更新したいときは、以下のコマンドを実行します。

# certbot renew --force-renewal

更新処理メッセージの最終行あたりに「Congratulations,」と表示されていれば、更新成功です。更新に要する時間は証明書の数にもよると思いますが、1つだけだと10秒ぐらいで終わります。

ちなみに、SSL証明書の有効期限まで30日を切ると以下のような内容でメールが送られてきます。

Your certificate (or certificates) for the names listed below will expire in
20 days (on 12 Jun 18 18:36 +0000). Please make sure to renew
your certificate before then, or visitors to your website will encounter errors.

SSL証明書を失効させる

取得したSSL証明書をいますぐに失効させたいときは、以下のコマンドを実行します。

# certbot revoke --cert-path /etc/letsencrypt/live/example.com/cert.pem

なお、SSL証明書を取得したマシンがすでになくて、上のコマンドを実行できない場合でも、DNS認証を使って取得済みのSSL証明書を失効させることができます。(手順は割愛します。)

参考URL

certbot/certbot/docs/using.rst at master · certbot/certbot · GitHub

あとがき

Let’s Encryptは無料で利用できる上に、更新も楽で大変助かります。