ソースインストールしたNginxにSnapd版Let’s Encryptを導入する方法
前提
書くこと/書かないこと
先日、Let’s Encryptをインストールする常識が変わっていることに気が付きました。
これまではcertbotをepelからインストールしていたのですが、最近(?)はsnapdと呼ばれるパッケージ管理システムを使ってインストールするのが常識のようです。
今回はたまたまですが、ソースインストールしたNginxにLet’s Encryptを導入する方法を書きたいと思います。
環境
AlmaLinux release 8.6 (Sky Tiger) ※ CentOS8互換OS
snapd 2.56.2-1
certbot 1.29.0
作業手順
snapdのインストール
snapdもepelからインストールできるので、epelのリポジトリが未インストールの場合は事前設定が必要ですが、今回はepelが利用できる前提で以下のコマンドを実行します。
# dnf install snapd
(中略)
================================================================================
パッケージ Arch バージョン Repo サイズ
================================================================================
インストール:
snapd x86_64 2.56.2-1.el8 epel 17 M
依存関係のインストール:
checkpolicy x86_64 2.9-1.el8 baseos 347 k
policycoreutils-python-utils noarch 2.9-19.el8 baseos 252 k
python3-audit x86_64 3.0.7-2.el8.2 baseos 86 k
python3-libsemanage x86_64 2.9-8.el8 baseos 127 k
python3-policycoreutils noarch 2.9-19.el8 baseos 2.2 M
python3-setools x86_64 4.3.0-3.el8 baseos 623 k
snap-confine x86_64 2.56.2-1.el8 epel 3.4 M
snapd-selinux noarch 2.56.2-1.el8 epel 519 k
(中略)
インストール済み:
checkpolicy-2.9-1.el8.x86_64
policycoreutils-python-utils-2.9-19.el8.noarch
python3-audit-3.0.7-2.el8.2.x86_64
python3-libsemanage-2.9-8.el8.x86_64
python3-policycoreutils-2.9-19.el8.noarch
python3-setools-4.3.0-3.el8.x86_64
snap-confine-2.56.2-1.el8.x86_64
snapd-2.56.2-1.el8.x86_64
snapd-selinux-2.56.2-1.el8.noarch
完了しました!
snapdのインストールが終わったら自動起動を有効にしてシンボリックリンクも作ります。
# systemctl enable --now snapd.socket
Created symlink /etc/systemd/system/sockets.target.wants/snapd.socket → /usr/lib/systemd/system/snapd.socket.
# ln -s /var/lib/snapd/snap /snap
snapdのインストール作業の最後にsnapdが最新化されていることを確認します。
# snap install core
# snap refresh core
2022-08-29T00:58:46+09:00 INFO Waiting for automatic snapd restart...
Warning: /var/lib/snapd/snap/bin was not found in your $PATH. If you've not restarted your session
since you installed snapd, try doing that. Please see https://forum.snapcraft.io/t/9469
for more details.
core 16-2.56.2 from Canonical✓ installed
snap "core" has no updates available
ここまででsnapdのインストールは完了です。
既存のCertbotのアンインストール
既にepelから直接インストールしたcertbotがある場合は、事前にアンインストールしておきます。
# dnf remove certbot
依存関係が解決しました。
================================================================================
パッケージ Arch バージョン Repo サイズ
================================================================================
削除中:
certbot noarch 1.22.0-1.el8 @epel 114 k
(中略)
削除しました:
certbot-1.22.0-1.el8.noarch
(中略)
完了しました!
snapdからのcertbotインストール
いよいよsnapdからcertbotをインストールします。
# snap install --classic certbot
Warning: /var/lib/snapd/snap/bin was not found in your $PATH. If you've not restarted your session
since you installed snapd, try doing that. Please see https://forum.snapcraft.io/t/9469
for more details.
certbot 1.29.0 from Certbot Project (certbot-eff✓) installed
インストールが済んだらcertbotをコマンドだけで実行できるようにシンボリックリンクを作成します。
# ln -s /snap/bin/certbot /usr/bin/certbot
Let’s Encrypt証明書の発行とNginxへの設定
過去にはここでwebrootやstandaloneという方法があり、certbot用にWebサーバに.well-knownディレクトリを設定したり、DNSサーバにTXTレコード(_acme–challenge)を入れるなどが必要でしたが、snapdのcertbotを使う場合はコマンド一発です。
今回はNginxをソースインストールしているので、nginx-ctlとnginx-server-rootを指定していますが、パッケージインストールしている場合はこの2つのパラメータは不要です。
<証明書を発行した後にnginx.confへの設定まで自動で実施する場合>
# certbot --nginx --nginx-ctl /usr/local/nginx/sbin/nginx --nginx-server-root /usr/local/nginx/conf
<nginx.confへの設定を手動で行う場合>
# certbot certonly --nginx --nginx-ctl /usr/local/nginx/sbin/nginx --nginx-server-root /usr/local/nginx/conf
以上で証明書発行も完了です。
nginx.confの確認
certonlyを指定しなかった場合は、nginx.confが書き換えられています。
nginx.confを開くと、ssl_cerfiticateとssl_certificate_keyが上書きされ、"# managed by Certbot"とコメントされています。
# HTTPS server
#
server {
listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/{FQDN}/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/{FQDN}/privkey.pem; # managed by Certbot
}
なお、certonlyを指定しなかった場合は自動的にnginxの再起動までやってくれます。
証明書の自動更新対応
snapd版以前のcertbotでは、証明書の自動更新をするためにはスクリプトを組んでcronで定期実行するなどの対応を行っていましたが、snapd版のcertbotはありがたいことに自動更新まで自動で設定してくれます。
Let’s Encrypt with certbotはかなり使いやすくなりましたね。
ディスカッション
コメント一覧
まだ、コメントがありません