Let’s Encryptでワイルドカード証明書の取得方法

ALL
スポンサーリンク
スポンサーリンク

はじめに

SSL証明書を取得する場合、host1.test.example.com、host2.test.example.com のように複数ホストの証明書を取得するのは面倒なので、Let’s Encrypt でまとめてワイルドカード証明書を取得する方法を説明します。

なお、前提条件として、ドメインの所有者としてDNSサーバを管理していることが必要です。
ワイルドカード証明書を自動で取得する仕組み(ACME)として、DNS-01 チャレンジを利用しますが、これには、ドメイン名の TXT レコードに特定の値を設定できることが必要だからです。

また、この設定を、certbot実行の際に自動的にできるように、Dynamic Update 機能を利用します。(このためのDNSサーバの設定方法は、本記事で説明しています)

本記事では例として、CentOS+bindで、ドメイン test.example.com の所有者の場合に、ワイルドカード証明書(*.test.example.com)を取得する方法を説明します。

以下の説明では、test.example.com の箇所を、適宜みなさんのドメイン名に置きかえてください。

certbot インストール

まずEPELリポジトリを使用できるようにします。

yum install epel-release.noarch

パッケージ管理ツールsnapd をインストールします。

yum install snapd
systemctl enable --now snapd.socket
ln -s /var/lib/snapd/snap /snap

ceetbot と、DNS-01 チャレンジに必要なDynamic Updateプラグイン dns-rfc2136 をインストールします。

snap install --classic certbot
snap set certbot trust-plugin-with-root=ok
snap install certbot-dns-rfc2136
ln -s /snap/bin/certbot /usr/bin/certbot

Dynamic Update用の認証情報ファイルの用意

ディレクトリを作成します。

mkdir /var/named/chroot/etc/certbot

certbot用の認証鍵 certbot-key.key を作成し、bindで読み取れるように権限を設定します。
(CentOS では bind のユーザは named なので、下記では named に読み込み権限を与えています)

tsig-keygen certbot-key > /var/named/chroot/etc/certbot/certbot-key.key
chown root:named /var/named/chroot/etc/certbot/certbot-key.key
chmod 640 /var/named/chroot/etc/certbot/certbot-key.key

次を実行します。

nsupdate -k /var/named/chroot/etc/certbot/certbot-key.key

実行でプロンプト ( > ) だけ表示されれば OKです。
CTRL-C を押して終了してください。

続けて、certbot-key.key の中身を確認します。

cat /var/named/chroot/etc/certbot/certbot-key.key

次のようになっています。
secret の箇所の値は、この後の手順で、dns-rfc2136.ini ファイル内の dns_rfc2136_secret = に指定します。

key "certbot-key" {
        algorithm hmac-sha256;
        secret "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
};

/var/named/chroot/etc/certbot 下に、認証情報ファイル dns-rfc2136.ini ファイルを次の内容で作成してください。
(このファイルは、以降で説明のcertbot実行時に、引数で指定します)

dns_rfc2136_server にSSL証明書を取得するサーバーのIPアドレスを指定します。dns_rfc2136_secret に、certbot-key.keyファイル内の secret の値を指定します。

dns_rfc2136_server = xx.xx.xx.xx
dns_rfc2136_port = 53
dns_rfc2136_name = certbot-key.
dns_rfc2136_secret = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
dns_rfc2136_algorithm = HMAC-SHA256

必要な権限を設定します。

chown root:named dns-rfc2136.ini
chmod 640 dns-rfc2136.ini

bindの設定

サーバ証明書を自動で取得する仕組み(ACME)として、DNS-01 チャレンジを利用しますが、これには、TXT レコードに特定の値を設定できることが必要です。
この設定では、certbot実行の際に、TXT レコードに設定すべき値が指定されます。この値を自動的に設定できるように、Dynamic Update 機能を利用します。

そのための設定を以下で説明します。

ディレクトリの用意

/var/named/chroot/var/named/dynamic/ ディレクトリを作成し、bindからも書き込みできるように、権限を設定します。
(CentOS では bind のユーザは named なので、下記では named に書き込み権限を与えています)

mkdir /var/named/chroot/var/named/dynamic/
chown root:named /var/named/chroot/var/named/dynamic
chmod 775 /var/named/chroot/var/named/dynamic

設定

以降の説明では、test.example.comと ns.test.example.com の箇所を、適宜みなさんのドメイン名・ネームサーバに置きかえてください。

次の内容で、ファイル /var/named/chroot/var/named/dynamic/_acme-challenge.test.example.com.zone を作成します。

$TTL 600
@ IN SOA test.example.com. root.test.example.com. (
        2023051501      ; Serial
        1h              ; Reflesh
        15m             ; Retry
        30d             ; Expire
        1h              ; Neg. cache TTL
        )
        IN      NS      ns.test.example.com.

このファイルは、bindからも書き込みできるように、権限を設定しておきます。
(CentOS では bind のユーザは named なので、下記では named に書き込み権限を与えています)

chown root:named /var/named/chroot/var/named/dynamic/_acme-challenge.test.example.com.zone
chmod 775 /var/named/chroot/var/named/dynamic/_acme-challenge.test.example.com.zone

test.example.com の zoneファイルの末尾に次の内容を追加します。

_acme-challenge                 IN      NS      ns.test.example.com.

/var/named/chroot/etc/named.conf の先頭に次の行を追加します。

include "/etc/certbot/certbot-key.key";

また、次のように named.conf内の test.example.com の zone設定の箇所で、check-names ignore; を追加してください。

zone "test.example.com" {
        :
        check-names ignore;
        :
};

また、named.conf内の test.example.com の zone設定箇所に続けて、次を追加してください。

zone "_acme-challenge.test.example.com" {
	type master;
	file "/var/named/dynamic/_acme-challenge.test.example.com.zone";
	check-names ignore;
	update-policy {
		grant certbot-key. name _acme-challenge.test.example.com. TXT;
	};
};

設定を反映させます。

systemctl restart named-chroot

テスト

ここまでの設定で問題ないかのテストを行います。

次を実行してください。

certbot certonly --dry-run --dns-rfc2136 --dns-rfc2136-credentials /var/named/chroot/etc/certbot/dns-rfc2136.ini -d '*.test.example.com'

問題無い場合は、出力の最後に
The dry run was successful.
と表示されます。

certbot実行

ACOEアカウントの作成

certbot実行では、ACOEアカウントが必要です。ACOEアカウント作成のために、下記を実行してください。

certbot register

実行すると、下記を聞かれるので、回答してください。

  • 連絡先メールアドレス
  • サービスの利用規約に同意するか
  • メールアドレスを、Certbotを開発する電子フロンティア財団(EFF)に伝えてもいいか。Yes の場合、EFFの活動に関するニュース、キャンペーンなどのメールが届きます。

(なお、certbot register をしないままでも、以降で実行している certbot certonly 実行の際に、同様のことが聞かれます)

certbot実行でSSL証明書取得

以上で必要な設定は完了しました。

次を実行すると、証明書を取得できます。
/etc/letsencrypt/live/test.example.com/ 下に証明書が作られます。

certbot certonly --dns-rfc2136 --dns-rfc2136-credentials /var/named/chroot/etc/certbot/dns-rfc2136.ini -d '*.test.example.com'

運用

Let’s Encrypt の証明書の有効期間は90日間なので、その期間が来る前に更新してください。
更新は次のコマンドを実行してください。

/usr/bin/certbot renew

参考

Let’s Encryptでワイルドカード証明書を取得する話 | IIJ Engineers Blog
CertbotとBINDの組み合わせでLet’s Encryptのワイルドカード証明書を取得・更新する – Qiita
#3 Ubuntu20でのLet’s Encryptによるワイルドカード証明書発行と自動更新(bind編) | ぽんこつロボット日記
CertbotとBINDの組み合わせでLet’s Encryptのワイルドカード証明書を取得・更新する – Qiita
Install certbot-dns-rfc2136 on CentOS using the Snap Store | Snapcraft
チャレンジの種類 – Let’s Encrypt – フリーな SSL/TLS 証明書

コメント