ACME(証明書の自動更新)手順書

acme.sh インストール&設定ガイド(FujiSSL ACME)

2025年10月14日

対象:Linux(Ubuntu/Debian、RHEL/CentOS、Amazon Linux)、macOS、WSL。HTTP-01 / DNS-01 対応。Nginx/Apache/スタンドアロン配備、DNSプロバイダAPI自動化までカバー。


外部公開における重要な注意
管理ツール「契約一覧」で表示される EAB KID / EAB HMAC Keyシークレット(秘密情報)です。漏洩すると第三者があなたの組織として証明書を不正発行できるおそれがあります。
GitHub/GitLab/Bitbucket 等の公開リポジトリ、Qiita/Zenn/ブログ、SNS、外部配布資料への記載は厳禁です。

0. 前提とゴール

  • FujiSSL 管理ツールで ACME 契約(OV)を作成済み、以下4点を控えている:
    ACMEサーバURL(例:ユーザごとに異なります)/ドメイン(FQDN)EAB KIDEAB HMAC Key
  • ゴール:サーバに fullchain.cerprivate.key を安全に配置し、自動更新まで動かす。

1. acme.sh のインストール

推奨:root で実施(鍵・ファイル権限を簡潔に保つため)。一般ユーザで行う場合は適宜 sudo を付与。

curl https://get.acme.sh | sh
# あるいは(プロキシ環境等で)
# git clone https://github.com/acmesh-official/acme.sh.git ~/.acme.sh
# cd ~/.acme.sh && ./acme.sh --install
  • インストール後のコマンド:~/.acme.sh/acme.sh(以下、短縮して acme.sh と表記)
  • ログ:~/.acme.sh/acme.sh.log
  • 自動更新は後述の --install-cronjob で設定します。

2. FujiSSL をCAに設定&EABでアカウント登録

# FujiSSL の ACME ディレクトリを指定
~/.acme.sh/acme.sh --set-default-ca --server 管理画面で取得したACMEサーバURL

# EAB を用いてアカウント登録(メールは通知用)
~/.acme.sh/acme.sh --register-account \
  --server 管理画面で取得したACMEサーバURL \
  --eab-kid <EAB_KID> \
  --eab-hmac-key <EAB_HMAC_KEY> \
  -m admin@example.com
  • シークレット保護:EAB KID / HMAC は環境変数や履歴に残さない。履歴に入れた場合は history -d~/.bash_history から消去。
  • 確認:~/.acme.sh/account.conf にアカウント情報が保存されます(600、root のみ)。

3. 証明書の発行(HTTP-01)

3-1) Webroot(Nginx/Apache 稼働中に無停止で発行)

# Webドキュメントルート(例:/var/www/html)を指定
~/.acme.sh/acme.sh --issue \
  -d example.com -d www.example.com \
  -w /var/www/html \
  --server 管理画面で取得したACMEサーバURL
  • 80/TCP を外部に開放。CDN/リバプロ利用時は /.well-known/acme-challenge/ をキャッシュ無効・素通し設定。
  • 失敗時は --debug 2 を追加し、ログ ~/.acme.sh/acme.sh.log を確認。

3-2) スタンドアロン(Webを一時停止できる環境)

systemctl stop nginx apache2 httpd || true

~/.acme.sh/acme.sh --issue \
  -d example.com \
  --standalone \
  --server 管理画面で取得したACMEサーバURL

systemctl start nginx apache2 httpd || true

4. 証明書の発行(DNS-01:ワイルドカード/複雑構成向け)

4-1) まずは手動で試す

~/.acme.sh/acme.sh --issue \
  -d example.com -d *.example.com \
  --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please \
  --server 管理画面で取得したACMEサーバURL

# acme.sh が表示する TXT を DNS に追加:
#   _acme-challenge.example.com  TXT  "(表示値)"
# 伝播後、Enter 指示に従って続行
  • 伝播確認:dig +short TXT _acme-challenge.example.com @8.8.8.8
  • 複数SAN同時発行では TXT が複数必要になることがあります(すべて残す)。

4-2) 本運用:DNS API で全自動化

Cloudflare(API Token)

export CF_Token=<Cloudflare_API_Token>
export CF_Account_ID=<AccountID(必要な場合)>
export CF_Zone_ID=<ZoneID(必要な場合)>

~/.acme.sh/acme.sh --issue \
  -d example.com -d *.example.com \
  --dns dns_cf \
  --server 管理画面で取得したACMEサーバURL
  • APIトークンは最小権限(Zone.DNS:Edit など)を付与し、export~/.bashrc 等に平文で保存しない。systemd の EnvironmentFile を使うと安全。

AWS Route53(インスタンスロール or プロファイル)

# 適切な IAM 権限(route53:ChangeResourceRecordSets 等)を付与
export AWS_PROFILE=<profile>   # もしくはロール付与で不要

~/.acme.sh/acme.sh --issue \
  -d example.com -d *.example.com \
  --dns dns_aws \
  --server 管理画面で取得したACMEサーバURL

他のDNS(例):dnspod(dns_dp)、AliDNS(dns_ali)、Google(dns_gcloud)、Azure(dns_azure)など多数。変数名は各プロバイダの仕様に従って設定。

5. 証明書の設置(Nginx/Apache 等)

5-1) Nginx へ設置

~/.acme.sh/acme.sh --install-cert -d example.com \
  --key-file /etc/nginx/ssl/example.com.key \
  --fullchain-file /etc/nginx/ssl/example.com.fullchain.pem \
  --reloadcmd "systemctl reload nginx"
chmod 600 /etc/nginx/ssl/example.com.key

nginx.conf(例):ssl_certificate /etc/nginx/ssl/example.com.fullchain.pem;ssl_certificate_key /etc/nginx/ssl/example.com.key;

5-2) Apache へ設置

~/.acme.sh/acme.sh --install-cert -d example.com \
  --key-file /etc/ssl/private/example.com.key \
  --fullchain-file /etc/ssl/certs/example.com.fullchain.pem \
  --reloadcmd "systemctl reload apache2 || systemctl reload httpd"
chmod 640 /etc/ssl/private/example.com.key
chgrp www-data /etc/ssl/private/example.com.key  # Debian系の例

acme.sh の保管場所
取得物の元ファイルは ~/.acme.sh/example.com/ にあります。
本番で参照するのは –install-cert でコピーしたパスに統一すると運用が安定します。

6. 自動更新(cron)

~/.acme.sh/acme.sh --install-cronjob
# 動作確認(手動実行)
~/.acme.sh/acme.sh --cron --home ~/.acme.sh --force
# ログ確認
tail -n 200 ~/.acme.sh/acme.sh.log
  • 更新は期限が近い証明書のみ実施。設置先のサービスは --install-cert--reloadcmd で自動リロードされます。
  • 自動アップグレード(任意):~/.acme.sh/acme.sh --upgrade --auto-upgrade

7. DNS 設定の要点

  • HTTP-01:対象FQDNの A/AAAA が発行サーバに向いていること。80/TCP 到達必須。CDN は /.well-known/acme-challenge/ をバイパス(キャッシュ無効)。
  • DNS-01:_acme-challenge.<FQDN> に TXT。ワイルドカードは _acme-challenge.example.com に集約。TTL は 60〜300 秒だと運用しやすい。
  • CAA を自前で設定している場合のみ、使用する CA を許可(未設定なら不要)。誤設定は発行失敗の原因。
  • 伝播確認:dig +short TXT _acme-challenge.example.com @8.8.8.8(権威ではなくパブリックDNSで確認)。

8. セキュリティと権限

  • EAB KID / HMAC・DNS API トークンは ファイル600 / 所有者root。CI・共有ストレージへ平文で置かない。
  • 秘密鍵は 600、必要に応じて Web サーバグループのみ参照可(Apache のみ 640 + chgrp など)。
  • ファイアウォール:HTTP-01 は 80/TCP、サイトは 443/TCP を開放。

9. よくあるエラーと解決

  • HTTP-01 失敗:80番閉塞/リダイレクトで別ドメインへ飛んでいる/CDN がチャレンジをキャッシュ。→ 80/TCP 開放・バイパス設定・一時的に「DNS only」。
  • DNS-01 失敗:TXT 値の余分な引用符・スペース/委任先ゾーンの編集漏れ。→ ゾーン正当性の確認、伝播完了まで待機。
  • 権限エラー:設置先の書込権限不足。→ --install-cert の出力先の所有者/権限を見直し。
  • 原因追跡:--debug 2 を付けて再実行、~/.acme.sh/acme.sh.log を確認。
# 例:詳細ログで再試行
~/.acme.sh/acme.sh --issue -d example.com -w /var/www/html \
  --server 管理画面で取得したACMEサーバURL --debug 2

10. 付録(便利コマンド)

# 証明書一覧
~/.acme.sh/acme.sh --list

# 個別更新/再発行
~/.acme.sh/acme.sh --renew -d example.com --force

# 取り消し(必要時のみ)
~/.acme.sh/acme.sh --revoke -d example.com

# バージョン/自己更新
~/.acme.sh/acme.sh --version
~/.acme.sh/acme.sh --upgrade --auto-upgrade

よく読まれている質問