ValueDomainでDNS管理しているドメインをさくらのクラウドのDNSを使ってLet’s Encrypt(certbot)のワイルドカード証明書を発行&自動更新 @Ubuntu+Nginx

ValueDomainでDNS管理しているドメインをさくらのクラウドのDNSを使ってLet’s Encrypt(certbot)のワイルドカード証明書を発行&自動更新 @Ubuntu+Nginx

主にDigitalOceanのエントリの内容にワイルドカード証明書を作るための作業を付加したもの。参考エントリをかいつまんでまとめた作業。

環境
Ubuntu 20.04
Nginx 1.18.0

下準備

  1. さくらのクラウドでDNSゾーンの作成
  2. バリュードメインにDNSレコード追加
  3. さくらのクラウドでAPIキー作成

さくらのクラウドでDNSゾーンの作成

  • 1DNSゾーン 44円/月のコストパフォーマンス
  • 他のレコードもそのうち引越す

DNSはバリュードメインで管理していたけど、この価格なら全て引っ越してもよいかも。とりあえずはacmeチャレンジのみ行う。

さくらのクラウドDNSでゾーンを作成

バリュードメインにDNSレコード追加

  • _acme-challenge.example.orgのネームサーバをさくらのクラウドに向ける
  • ネームサーバはさくらのクラウド > DNS > 設定したDNSゾーンの情報に記載してあるものを指定する

さくらのクラウドDNS情報でNSサーバ名確認

バリュードメインで追加するDNSエントリ。バリュードメインの記法だと下記。

ns _acme-challenge ns1.xxxx.sakura.ne.jp.
ns _acme-challenge ns2.xxxx.sakura.ne.jp.

Value Domain DNS設定でネームサーバを指定する

さくらのクラウドでAPIキー作成

  • 名前:適時(LetsEncryptCertBot用等)
  • アクセルレベル:作成・削除

さくらのクラウドAPIキー作成

サーバ(リモート)で行う作業

  1. APIアクセス用にトークンをファイルに保存
  2. CertbotとさくらのクラウドDNS用のCertbotプラグインをインストール
  3. 証明書発行
  4. Nginxの設定ファイル更新
  5. 検証

APIアクセス用のトークンをファイルに保存

さくらのクラウドでAPIキー作成で作成したアクセストークンとアクセストークンシークレットをファイルに保存する。

vi ~/.sakura
dns_sakuracloud_api_token = アクセストークン
dns_sakuracloud_api_secret = アクセストークンシークレット

# パーミッションを変更しておく
chmod 600 ~/.sakura

certbotとプラグインをインストール

  • Certbot
  • さくらのクラウドDNS用のプラグイン
sudo apt install certbot python3-certbot-dns-sakuracloud

証明書の取得

--post-hook でnginxのリロードコマンドを設定するエントリもあるが、--deploy-hookだと更新が成功したときのみコマンドが走るのでこちらを使う。
後ほどの検証時、--post-hook で設定している場合は--dry-runでも再起動の確認ができる。
--deploy-hookの場合はnginxのリロードはスキップされる

sudo certbot certonly --dns-sakuracloud \
--dns-sakuracloud-credentials ~/.sakura \
-d example.org \
-d *.example.org \
-m “your_mail_address@example.org” \
--agree-tos \
--deploy-hook "systemctl reload nginx"

# レスポンス
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:  y

Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for example.org
dns-01 challenge for example.org
Waiting 90 seconds for DNS changes to propagate

# 90秒待つ

Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.org/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.org/privkey.pem
   Your cert will expire on 2022-11-02. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Nginxがリロードしたかログを確認してみる

sudo journalctl -u nginx -n 1

# レスポンス
-- Logs begin at Mon 2022-07-25 21:52:18 JST, end at Thu 2022-08-04 16:08:10 JST. --
Aug 04 16:06:11 web02-ishikari systemd[1]: Reloaded A high performance web server and a reverse pro>
lines 1-2/2 (END)

この時点ではNginxに適用されていないので注意。
Nginxの設定ファイルに手動で追記する必要がある。

server {
    ….
    ssl_certificate      /etc/letsencrypt/live/example.org/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/example.org/privkey.pem;
    ….
}

nginxをリロードすれば証明書が有効になる。
sudo systemctl reload nginx

余談

python3-certbot-dns-sakuracloudと同時にpython3-certbot-nginxを使えばnginxの設定ファイルも自動更新出来るかと思ったけど、certbotのプラグインは両方同時に使えないっぽいので断念した。

certbotの自動更新の検証

検証コマンド

証明書の更新を--dry-runオプションをつけて(実際には更新しないで)実行。

sudo certbot renew --dry-run

# レスポンス
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/example.org.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator dns-sakuracloud, Installer None
Renewing an existing certificate
Performing the following challenges:
dns-01 challenge for example.org
dns-01 challenge for example.org
Waiting 90 seconds for DNS changes to propagate
Waiting for verification...
Cleaning up challenges
Dry run: skipping deploy hook command: systemctl reload nginx

certbotのタイマーを確認

sudo systemctl status certbot.timer

# レスポンス
● certbot.timer - Run certbot twice daily
     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Thu 2022-08-04 11:45:06 JST; 4h 24min ago
    Trigger: Fri 2022-08-05 03:51:37 JST; 11h left
   Triggers: ● certbot.service

Aug 04 11:45:06 your_server_host_name systemd[1]: Started Run certbot twice daily.

ワイルドカード+マルチドメインの証明書発行

更にドメインを追加してワイルドカード+マルチドメインの証明書を作成するには-d ドメインを追加していく。

sudo certbot certonly --dns-sakuracloud \
--dns-sakuracloud-credentials ~/.sakura \
-d example.org \
-d *.example.org \
-d foo.com \
-d *.bar.com \
...

発行可能(実践済み)
ただしチャレンジが全てdns-01になるため証明書に登録するドメインすべてDNSの設定が必要になる。

参考エントリ

Ubuntu 20.04でLet’s Encryptを使用してNginxを保護する方法 | DigitalOcean

Let's EncryptでワイルドカードなSSLサーバー証明書が安価なVPSとDNSでマルチドメインWEBサーバーな話

Let’s EncryptによるSSLサーバー証明書の取得、自動更新設定(Snapを使用しない版) | 稲葉サーバーデザイン

[Let’s Encrypt]さくらのクラウドDNS経由でワイルドカード証明書を後付けのcertbotで取得する方法 – 株式会社シーポイントラボ | 浜松のシステム・RTK-GNSS開発

  • さくらのクラウドの部分だけ参考にさせてもらう。
  • certbot-autoは古いので現在は非推奨

Ubuntu 20.04上でCertbot + さくらのクラウドDNSを使用してワイルドカード証明書を取得する方法 – 株式会社シーポイントラボ | 浜松のシステム・RTK-GNSS開発

Let's EncryptのSSL証明書更新時にサービスを再起動する - Qiita