【Let's Encrypt】さくらのクラウドのDNSで「DNS-01 Challenge」を使ってみた
すでにネット上に情報が溢れてるネタなんですが、保守的なウチでもようやく有料のTLS証明書じゃなく、無料のLet's Encrypt なんぞを使ってみようか、と思い始めまして。
で、本番系のドメイン認証の方法は「HTTP-01 challenge」で良いかな、と思ってるんですが、本番系の初回の証明書取得やテスト系の証明書をどうしようか、と調べてみたら、DNS の TXT レコードでドメイン認証できる「DNS-01 challenge」なんて方法を知ったので試してみました。
今回は、CentOS 7.8 向けの自分用メモになります。
さくらのクラウドでAPIキーを作成する
うちでは「さくらのクラウド」のDNSを使っているので、まず最初に、さくらのクラウド側で API キーを作成しておきます。
この API キーは、certbot が DNS の TXT レコードに書き込みをするのに必要なものです。
「DNS の TXT レコードに書き込めるなら、確かにそのドメインの所有者やろ」という認証方法ですね。
さくらのクラウドでAPIキーを発行するには、「さくらのクラウド ホーム」画面 → 左の「APIキー」から対象アカウントを選択 → APIキーを「追加」します。
APIキー編集画面では、APIキーの種類を「リソース操作APIキー」に、アクセスレベルを「設定編集」にして「作成」します。
APIキーを作成すると、画面上に「アクセストークン」と「アクセストークンシークレット」が表示されるので、控えておきます。
次にサーバー側に certbot と、certbot-dns-sakuracloud パッケージをインストールします。(※ epel が有効になっていない場合は別途有効にしてください。)
$ sudo yum -y --enablerepo=epel install certbot
$ sudo yum -y --enablerepo=epel install certbot-dns-sakuracloud
さくらのクラウドのAPIキーをファイルに書いておきます。
$ sudo vi .sakura
書き方は以下のとおり。
dns_sakuracloud_api_token = 'ここにアクセストークン'
dns_sakuracloud_api_secret = 'ここにアクセストークンシークレット'
Code language: JavaScript (javascript)
権限を固くしておきます。
$ sudo chmod 600 .sakura
certbot + DNS-01 Challenge で証明書を取得します。
$ sudo certbot certonly --dns-sakuracloud \
--dns-sakuracloud-credentials ~/.sakura \
-d www.example.com \
-d example.com \
-m contact@example.com \
--manual-public-ip-logging-ok \
--agree-tos
Code language: PHP (php)
あとは、DNS の TXT レコードにトークンを書く → DNS の伝播を待つ → 証明書を取得、までを自動で行ってくれます。
取得した証明書は、以下のパスに格納されます。
/etc/letsencrypt/live/www.example.com
また、次回以降は以下のコマンドで証明書の更新が可能です。
$ sudo certbot renew
renew が使えるのは、以下のパスに certbot の設定ファイルが出来ている前提になりますが、これは、先の手動実行時に自動で作成されるので便利。
/etc/letsencrypt/renewal/www.example.com.conf
適切な権限設定をするとは言え、API キーを配置して DNS 情報を書き換える「DNS-01 Challenge」を本番系のWEBサーバーで直接扱うのはセキュリティ的にどうかと思いますが、この方法であれば DNS の A レコードが向いていない端末・サーバー上でも Let's Encrypt の証明書を入手できる、ということで、シーンによっては大変便利と思います。
Aレコードが向いていて、かつ、まだ WEB サーバー起動前なら Standalone モードを使えばいいとは思うんですが。
ちなみに、どうしても本番系で使いたい場合は、証明書インストール予定のWEBサーバー以外で別途、証明書を取得しておいて、WEBサーバーへ証明書を移送するのが良いんじゃないでしょうか。