ソースインストールした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; sudo 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レコード(_acmechallenge)を入れるなどが必要でしたが、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はかなり使いやすくなりましたね。