Let’s Encryptの導入方法(Webroot版)

2022年6月24日

前提

書くこと/書かないこと

フリーで自動化されたオープンな認証局であるLet’s Encryptが発行するSSL証明書の導入方法を説明します。
Let’s Encryptの導入方法としては、既にドメインが取得済みで外部からアクセスできるWebサーバが起動していることを前提としたwebrootとWebサーバがなくても外部からアクセスできれば利用できるstandaloneの二つの方法があります。今回はwebrootを使った導入方法について記載します。

環境

AlmaLinux 8.6 ※CentOS8代替OS

さくっと

epelの有効化~certbotのインストールまで

let’s encryptを使うためにはacmeクライアントが必要となります。今回はその中でも有名なcertbotを使用します。

certbotはepelから入手できるため、epelを有効化していない場合は先にepelを有効にします。

dnf install epel-release

epelを有効にしたら次はcertbotをインストールします。

dnf install certbot

今回は、certbot-1.22.0-1.el8.noarchがインストールされました。

証明書ファイルの作成・取得

certbotを使って証明書を作成・取得します。ちなみに今回はwebrootという方法を使いますが、これを利用するためにはいくつかの前提条件があります。

  • apacheやnginxなどのwebサーバが起動していること
  • port 80, 443が開いており、サーバにインターネットからアクセスできる状態になっていること
  • DNSの設定が終わっており、FQDNでサーバにアクセスができること

上記が満たされていることを確認したら、certbotを実行します。

certbot certonly -d {FQDN} -w {DocumentRoot} --email {email}

{FQDN} ・・・ドメイン名

{DocumentRoot} ・・・webサーバで設定したルートディレクトリまでのフルパス

{email} ・・・メールアドレス

Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Account registered.
Requesting a certificate for {FQDN}

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/{FQDN}/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/{FQDN}/privkey.pem
This certificate expires on 2022-08-25.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

“Successfully received certificate."と表示されましたのでインストールできました。

証明書と秘密鍵は /etc/letsencrypt/live/{FQDN}/ に保存されています。

証明書と秘密鍵のアクセス権変更~Webサーバへの組み込み

証明書と秘密鍵が作られたディレクトリはcertbotを実行したユーザの所有になっていますので、Webサーバが読み取れるようにアクセス権を変更します。今回はapacheに組み込むのでユーザとグループをapacheに変更します。

chown apache:apache -R /etc/letsencrypt/live/{FQDN}/

次はapacheへの組み込みです。
まずはmod_sslが有効になっているか確認します。

httpd -M | grep ssl

ssl_module (shared)が得られれば有効になっています。
もしモジュールが見つからなかった場合はインストールします。

dnf install mod_ssl

mod_sslが有効になっていることを確認したらconfファイルを更新します。

<VirtualHost _default_:443>
(省略)
SSLCertificateFile /etc/letsencrypt/live/{FQDN}/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/{FQDN}/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/{FQDN}/chain.pem
(省略)
</VirtualHost>

設定が済んだらapacheを再起動します。

systemctl restart httpd.service

ここまでで、httpsでアクセスできるようになります。

証明書の自動更新対応

let’s encryptの証明書は有効期間が3か月しかないため、このままだと3か月ごとに証明書を更新する作業を行わなければなりません。これを避けるために、自動更新のスクリプトを仕込みます。

ファイル名や保存場所は任意の場所で大丈夫ですが、ファイルに下記を記述して保存します。

#!/bin/sh
certbot renew -q --no-self-upgrade --post-hook "systemctl restart httpd.service"

ファイルに実行権限を付与します。

chmod 0700 /etc/letsencrypt/auto-renewal.sh

最後にcronの設定をして上記スクリプトを定期実行します。

crontab -e
0 3 * * * /etc/letsencrypt/auto-renewal.sh

これで毎日3時にスクリプトが実行され、期限が近づくと証明書が自動更新されるようになります。

こってりと

時間とができてやる気が出たら加筆します(しないかも)。