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証明書管理の負担をほぼゼロにするため非常に有効である。

特にメールサーバーを運用している場合は、早めに導入しておくことを強くおすすめする。