Cloudflare DNS-01 と acme.sh で Wildcard SSL 証明書を自動更新する方法(Postfix / Dovecot 対応)Mac mini server
自宅サーバーや個人サーバーを運用していると、SSL証明書の更新管理は避けて通れない課題である。
特にメールサーバー(Postfix / Dovecot)を運用している場合、証明書の期限切れはメールクライアントの警告や接続エラーにつながるため、安定運用のためには自動更新の仕組みを構築しておくことが重要になる。
本記事では acme.sh と Cloudflare DNS-01認証を利用し、
・Wildcard SSL証明書(*.example.com)
・メールサーバー(Postfix / Dovecot)への適用
・証明書の完全自動更新
を構築した手順をログ形式でまとめる。
この方法では ポート80/443を開放する必要がなく、Webサーバーを停止する必要もないため、自宅サーバーやNAS環境でも安定して運用できる。
この記事で構築する構成
今回構築する証明書管理の構成は次の通り。
Cloudflare DNS
↓
DNS-01認証
↓
acme.sh
↓
Wildcard SSL証明書
↓
Postfix / Dovecot / Webサーバー
この構成では Cloudflare API を利用して DNS TXT レコードを自動作成することで証明書認証を行う。
Wildcard証明書を使うメリット
通常のSSL証明書では、サブドメインごとに証明書を発行する必要がある。
例
mail.example.com
blog.example.com
vpn.example.com
photos.example.com
しかし Wildcard証明書を取得すると
*.example.com
という1枚の証明書で すべてのサブドメインをカバーできる。
サーバーを運用しているとサービスが増えることが多いため、Wildcard証明書は管理を大幅に簡単にする。
acme.sh を選ぶ理由
Let’s Encrypt証明書を取得するツールには主に次のものがある。
certbot
acme.sh
今回 acme.sh を選んだ理由は以下。
・DNS認証が簡単
・Cloudflare API連携が標準で用意されている
・軽量でシンプル
・自動更新が非常に安定している
特に DNS-01認証との相性が良い。
1 acme.sh のインストール
まず acme.sh をインストールする。
curl https://get.acme.sh | sh
インストール後はシェル環境を再読み込みする。
source ~/.bashrc
または
source ~/.zshrc
2 Let’s Encrypt をデフォルトCAに設定
acme.sh のデフォルトCAは ZeroSSL になっている場合があるため、Let’s Encrypt に変更する。
acme.sh –set-default-ca –server letsencrypt
3 ACMEアカウント登録
証明書管理用のメールアドレスを登録する。
acme.sh –register-account -m [email protected]
このメールアドレスは 証明書期限通知などの連絡用であり、証明書発行そのものには関係しない。
4 Cloudflare API Token を作成
Cloudflare ダッシュボードから API Token を作成する。
必要な権限
Permissions
Zone → DNS → Edit
対象ゾーン
example.com
作成後、API Token を控えておく。
5 Cloudflare API Token を環境変数に設定
Cloudflare API Token を環境変数として設定する。
export CF_Token=“YOUR_CLOUDFLARE_API_TOKEN”
6 Wildcard SSL証明書の発行
DNS-01認証を利用して証明書を取得する。
acme.sh –issue
-d example.com
-d “*.example.com”
–dns dns_cf
成功すると証明書は次のディレクトリに生成される。
~/.acme.sh/example.com_ecc/
ここには次のファイルが生成される。
example.com.cer
example.com.key
ca.cer
fullchain.cer
7 サーバー用証明書ディレクトリ作成
サービスから参照しやすい場所に証明書を配置する。
sudo mkdir -p /etc/ssl/example
8 証明書をサーバー用ディレクトリへインストール
証明書更新時にも自動反映されるように install-cert を使う。
acme.sh –install-cert -d example.com –ecc
–key-file /etc/ssl/example/key.pem
–fullchain-file /etc/ssl/example/fullchain.pem
–reloadcmd “sudo postfix reload; sudo dovecot reload”
これにより
証明書更新
↓
Postfix reload
↓
Dovecot reload
が自動で実行される。
9 Postfix の証明書設定
Postfix の TLS証明書設定を変更する。
sudo postconf -e “smtpd_tls_cert_file = /etc/ssl/example/fullchain.pem”
sudo postconf -e “smtpd_tls_key_file = /etc/ssl/example/key.pem”
設定反映
sudo postfix reload
10 Dovecot の証明書設定
Dovecot の SSL設定を変更する。
設定ファイル例
/etc/dovecot/conf.d/10-ssl.conf
設定内容
ssl_cert = </etc/ssl/example/fullchain.pem
ssl_key = </etc/ssl/example/key.pem
反映
sudo dovecot reload
11 証明書の動作確認
IMAPサーバーの証明書を確認する。
openssl s_client -connect mail.example.com:993 -servername mail.example.com </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates
確認ポイント
issuer=Let’s Encrypt
subject=CN=example.com
12 自動更新の確認
acme.sh は自動的に cron を登録する。
crontab -l
例
42 7 * * * ~/.acme.sh/acme.sh –cron
この場合、毎日 7:42 に証明書更新チェックが実行される。
証明書は通常
有効期限 90日
更新開始 約30日前
のタイミングで自動更新される。
この構成のメリット
■ ポート開放不要
DNS認証のため 80 / 443 ポートの開放が不要
■ Webサーバー停止不要
HTTP認証と違い Webサーバーを停止する必要がない
■ Wildcard証明書
1枚で複数サービスをカバー
mail.example.com
blog.example.com
vpn.example.com
photos.example.com
■ 完全自動更新
証明書更新後に Postfix / Dovecot が自動 reload
まとめ
acme.sh と Cloudflare DNS-01 を組み合わせることで
・Wildcard SSL証明書
・メールサーバー対応
・完全自動更新
をシンプルに実現できる。
自宅サーバーを運用している場合、この構成は SSL証明書管理の負担をほぼゼロにするため非常に有効である。
特にメールサーバーを運用している場合は、早めに導入しておくことを強くおすすめする。
