Posh-ACMEのDNS認証(RFC2136)を使ったSSL証明書発行

こんにちは、Tomです。
さくらのクラウドからは脱線している気がしますが、
思いのほかPosh-ACMEの記事に需要があるそうで、擦りたいと思います!

また、Posh-ACMEの説明や導入方法、自動化方法は、本記事では説明しないので、前回記事を参考にしてください。
(前回記事)
https://www.netassist.ne.jp/sakuracloud-labo/archives/861
目次

DNS認証とRFC2136について

過去の記事でも紹介しておりますが、ワイルドカード証明書やローカル環境のサイトにおいては、
認証ファイルを用いたHTTP-01認証が使えず、DNSに特定のTXTレコードを登録するDNS-01認証が必要です。

(参考)
https://www.netassist.ne.jp/sakuracloud-labo/archives/711

Posh-ACMEでも数多くDNS認証用のプラグインが提供されておりますが、お使いのDNSサービスに応じて、
選択する必要があります。(確認した限りでは、さくらのDNS用はなかったですが…)

今回は弊社でも利用しているBINDネームサーバとも連携できるようにRFC2136プラグインを使って、自動化します。

DNSサーバ側(BIND)の準備

まずは、外部からレコード更新(Dynamic Update)が出来るように
DNSサーバ側にて許可設定の追加と制御用のTSIGキーを作成します。
BIND環境であれば、下記コマンドでTSIGキーが作成できます。

# tsig-keygen acme-key

すると、下記のような形式でキー情報が出力されます。

key "acme-key" {
        algorithm hmac-sha256;
        secret "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=";
};

このsecret の値がいわゆる鍵本体なので大切に取り扱いましょう。

次に、BINDのnamed.conf にDynamic Updateの許可設定を追加します。

key "acme-key" {
    algorithm hmac-sha256;
    secret "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=";
};

zone "example.com" {
    type primary;
    file "/var/named/example.com.zone";

    update-policy {
        grant "acme-key" name "_acme-challenge.example.com." TXT;
    };
};

細かいゾーンブロック内の設定は自身の環境に併せて調整して欲しいですが、
基本的にはkeyブロックとzoneブロック内のupdate-policyが同じように書けていれば問題ないです。
また、DNS認証に使用するサブドメインは_acme-challengeなので
このTXTレコードだけ更新できるように制限しましょう。

Webサーバ(Windows)の準備

Dynamic Updateにはnsupdateコマンドが必要なので、用意します。
まず、下記サイトからBINDツールを一式ダウンロード、ファイル内にあるnsupdate.exeを回収し、
任意のパスに配置します。

https://downloads.isc.org/isc/bind9/9.17.15/BIND9.17.15.x64.zip

今回は下記に配置しました。

C:\BIND\nsupdate.exe

下記のようにバージョン情報が出力されれば動作としてはokです。

C:\BIND\nsupdate.exe -V
nsupdate 9.17.15

RFC2136プラグインを使用した証明書発行

では実際に、SSL証明書を発行しますが、RFC2136プラグインを使用するにあたって、
必要な引数を入力します。

PowerShellで以下のように指定してください。

$pArgs = @{
    DDNSNameserver = 'DNSサーバのIP or ホスト名'
    DDNSKeyName = 'acme-key'
    DDNSKeyType = 'hmac-sha256'
    DDNSKeyValue = (ConvertTo-SecureString 'TSIG Key Value' -AsPlainText -Force)
    DDNSExePath = 'C:\BIND\nsupdate.exe'
}

TSIG Key Valueには、TSIGキーのsecretを入力してください。

ここまで済んだら、Posh-ACMEを使って証明書発行ができます。
レコードの反映状況によっては発行まで数十秒かかるので気長に待ちましょう。

> New-PACertificate example.com -Plugin RFC2136 -PluginArgs $pArgs

Subject             NotAfter            KeyLength Thumbprint                               AllSANs
-------             --------            --------- ----------                               -------
CN=example.com 2027/01/02 16:01:33 2048      ************************************** {example.com}

初回発行までできれば、自動化方法は前回記事と一緒なので、進めてみてください。
また、TSIGキーやDynamic Updateの許可設定範囲によっては、外部からDNSレコードを自由に操作されてしまう可能性があるので、取り扱いには十分に注意しましょう!

では、次回まで

お問い合わせ

この記事をシェアする
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

猫とお酒好き
さくらのクラウド検定取得

目次