ネームサービスを使ったサーバ証明書の自動更新は、ダイナミックDNSを使うことで可能になります。またこの更新方法は、ワイルドカード証明書の利用に対応しています。
検証
- ・
- OS:CentOS 7
- ・
- サービス:Let's Encrypt
概要:ワイルドカード証明書
公開するサーバの数が増えると、そのぶん、サーバ証明書の取得〜更新も大変になってきます。
ワイルドカード証明書を使えば、ひとつのサーバ証明書で、対象のドメイン直下のすべてのサーバを認証できるようになります。[※1]
- ※1
- ワイルドカード証明書は、次のメール関連アプリでも使えることを確認しています:メールサーバ(Postfix )、メールボックスサーバ(Dovecot )、メールクライアント(Apple Mail / iOS)。
概要:ネームサービスを使った証明書の自動更新
サーバ証明書をネームサービスを使って取得するときは、ACMEプロトコルの認証キーを記載したTXTレコードを、対象のドメインに一時的に追加する必要があります(CA側は、ネームサービスを参照し、この値が指定したものと同じなら、サーバ証明書の取得を許可します)。
これを手動で行う場合は、たんに認証キーのTXTレコードを、対象のドメインに手作業で追加すればいいだけです。しかし自動で行う場合は、このレコードの登録を、人手を介さずに行うしくみが必要です。そのために使うのが、ダイナミックDNSですーーダイナミックDNSは、ドメインのエントリの更新(追加・削除)〜公開を、コマンドベースで行うためのしくみです。
手順
サーバ証明書の自動更新スクリプトのパッケージを、取得〜設置します:
$ yum --enablerepo=epel install certbot $ yum --enablerepo=epel install python2-certbot-dns-rfc2136 # DNS向けACMEプロトコルを利用するためのプラグイン
ダイナミックDNSを使うため、ネームサーバ向けの認証キーを生成し〜ファイルに格納します:
$ tsig-keygen letsencrypt-key > /var/named/letsencrypt.key $ chown named:named /var/named/letsencrypt.key $ chmod 600 /var/named/letsencrypt.key
ネームサーバに、(ACMEプロトコルの認証キーを記述する)TXTレコードを更新するためのドメインを追加します。また、認証キーを格納したファイルを、読み込むようにします:
- ・
- /etc/named.conf:
zone "_acme-challenge.<DOMAIN>" IN { type master; file "/var/named/dynamic/domain_acme-challenge.<DOMAIN>.txt"; update-policy { grant letsencrypt-key. name _acme-challenge.<DOMAIN>. TXT; }; }; include "/var/named/letsencrypt.key";
- ・
- /var/named/dynamic/domain_<DOMAIN>.txt:
... _acme-challenge IN NS ns1 ; ACMEプロトコルに使うネームサーバを指定 ...
- ・
- /var/named/dynamic/domain_acme-challenge.<DOMAIN>.txt:
@ IN SOA ns1.<DOMAIN>. postmaster.ns1.<DOMAIN>. ( 2022070101 ; serial 10800 ; refresh (3 houres) 3600 ; retry (1 houres) 604800 ; expire (7 days) 60 ) ; minimum ttl (1 minutes) IN NS ns1.<DOMAIN>.
$ chmod 644 _acme-challenge.<DOMAIN>.txt
サーバ証明書の自動更新スクリプトが、ダイナミックDNSを使えるようにします(ネームサーバ向けの認証キーは、先に生成したものを指定します):
- ・
- /etc/letsencrypt/dns-rfc2136.ini:
dns_rfc2136_server = <ADDRESS_NAME_SERVER> dns_rfc2136_port = 53 dns_rfc2136_name = letsencrypt-key. dns_rfc2136_secret = <KEY> dns_rfc2136_algorithm = HMAC-SHA256
$ chmod 600 dns-rfc2136.ini
この状態で、自動更新スクリプトの動作を試験します(引数「--dry-run 」を指定することで、CA側が用意した検証サイトにアクセスし、正式サイトでの動作をシミュレートします):
$ certbot \ certonly \ --dry-run \ --dns-rfc2136 \ --dns-rfc2136-credentials /etc/letsencrypt/dns-rfc2136.ini \ --domain <DOMAIN> \ --domain *.<DOMAIN> \ --email <USER>@<DOMAIN>
試験の結果に問題がなければ、CA側の正式サイトにアクセスし、サーバ証明書を取得します:
$ certbot \ certonly \ --dns-rfc2136 \ --dns-rfc2136-credentials /etc/letsencrypt/dns-rfc2136.ini \ --domain <DOMAIN> \ --domain *.<DOMAIN> \ --email <USER>@<DOMAIN>
以降の自動更新は、次の引数のみで実行できます:[※1]
$ certbot renew --dry-run --cert-name <DOMAIN>
- ※1
- 定期実行の場合は、このコマンドをクロンに登録します。また必要なら、関連するサービスの再起動を指定します。