MkItYs

MkItYs > ネットワークとサーバを作る > 

images

サーバ証明書を取得〜更新する(ワイルドカード証明書、ネームサーバ経由):Let's Encrypt

images

ネームサービスを使ったサーバ証明書の自動更新は、ダイナミック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
定期実行の場合は、このコマンドをクロンに登録します。また必要なら、関連するサービスの再起動を指定します。