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

lego インストール&設定ガイド(FujiSSL ACME)

2025年10月20日


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

0. 前提とゴール

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

1. lego のインストール

Linux(64bit バイナリ)

# 公式リリースから最新を取得(例:vX.Y.Z)
LEGO_VER=vX.Y.Z
curl -L -o /tmp/lego.tar.gz "https://github.com/go-acme/lego/releases/download/${LEGO_VER}/lego_${LEGO_VER#v}_linux_amd64.tar.gz"
sudo tar -C /usr/local/bin -xzf /tmp/lego.tar.gz lego
lego --version

macOS(Homebrew)

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install lego
lego --version

Windows

  • WSL:Ubuntu を導入して上記 Linux 手順でOK。
  • ネイティブ:GitHub Releases の lego_windows_amd64.zip を展開し、lego.exe を PATH の通った場所へ配置。

2. FujiSSL でのアカウント作成(EAB)

# メールは通知用(失効/更新の連絡先)
lego --server 管理画面で取得したACMEサーバURL \
     --eab \
     --kid <EAB_KID> \
     --hmac <EAB_HMAC_KEY> \
     --email admin@example.com \
     --accept-tos \
     run --http --domains example.com
# ↑ ここでは一度 http チャレンジで run して「アカウント作成」を済ませるのが最短です。
#   以降の正式発行は別コマンドで行って構いません。
  • HMAC Key の形式:FujiSSL の管理ツールに表示される EAB HMAC Key をそのまま指定します(base64 等への変換は不要です)。
  • 作成されたアカウント情報は lego のワークディレクトリ(次章参照)に保存されます。

3. 出力先(–path)とファイル構成

lego はカレントに .lego/ を作成します。運用では明示的に --path を固定しましょう。

/opt/lego/
  ├── certificates/
  │   ├── example.com.crt       (サーバ証明書)
  │   ├── example.com.issuer.crt(中間証明書)
  │   ├── example.com.json      (メタ)
  │   └── example.com.key       (秘密鍵)
  └── accounts/…                (ACMEアカウント)

4. 証明書の発行:HTTP-01(もっとも簡単)

4-1) Webroot(無停止、既存Web配下に書き込む)

# 例:/var/www/html がドキュメントルート
sudo lego --server 管理画面で取得したACMEサーバURL \
  --path /opt/lego \
  --eab --kid <EAB_KID> --hmac <EAB_HMAC_KEY> \
  --email admin@example.com \
  --http --http.webroot /var/www/html \
  --domains example.com --domains www.example.com \
  run
  • 80/TCP を外部公開。CDN/リバプロ経由は /.well-known/acme-challenge/素通し・キャッシュ無効に。

4-2) スタンドアロン(一時的に:80 を lego が占有)

sudo systemctl stop nginx apache2 httpd || true

sudo lego --server 管理画面で取得したACMEサーバURL \
  --path /opt/lego \
  --eab --kid <EAB_KID> --hmac <EAB_HMAC_KEY> \
  --email admin@example.com \
  --http \
  --domains example.com \
  run

sudo systemctl start nginx apache2 httpd || true

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

5-1) Cloudflare(API Token)

# 最小権限の API Token を用意(Zone.DNS:Edit)
export CLOUDFLARE_DNS_API_TOKEN=<CF_API_TOKEN>

sudo lego --server 管理画面で取得したACMEサーバURL \
  --path /opt/lego \
  --eab --kid <EAB_KID> --hmac <EAB_HMAC_KEY> \
  --email admin@example.com \
  --dns cloudflare \
  --domains example.com --domains *.example.com \
  run
  • 環境変数名は CLOUDFLARE_DNS_API_TOKEN(もしくは旧来の CLOUDFLARE_API_TOKEN)。
  • トークンはファイル600、root 管理。~/.bashrcへの平文保存は避け、systemd EnvironmentFile などで供給を推奨。

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

# awscli やIMDSで認証済みであること(route53:ChangeResourceRecordSets 権限)
export AWS_PROFILE=<profile>   # ロールなら不要

sudo lego --server 管理画面で取得したACMEサーバURL \
  --path /opt/lego \
  --eab --kid <EAB_KID> --hmac <EAB_HMAC_KEY> \
  --email admin@example.com \
  --dns route53 \
  --domains example.com --domains *.example.com \
  run

他のDNSプロバイダ--dns にプロバイダ名(例:azurednspodgcloud など)を指定し、legoの要求する環境変数を設定してください。

6. Webサーバへの設置(Nginx/Apache)

6-1) Nginx

# lego 出力(/opt/lego/certificates)を本番パスへコピー
install -d -m 755 /etc/nginx/ssl
install -m 600 /opt/lego/certificates/example.com.key /etc/nginx/ssl/example.com.key
install -m 644 /opt/lego/certificates/example.com.crt /etc/nginx/ssl/example.com.fullchain.pem

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

systemctl reload nginx

6-2) Apache

install -d -m 755 /etc/ssl/{certs,private}
install -m 640 /opt/lego/certificates/example.com.key /etc/ssl/private/example.com.key
install -m 644 /opt/lego/certificates/example.com.crt /etc/ssl/certs/example.com.fullchain.pem
chgrp www-data /etc/ssl/private/example.com.key  # Debian系の例

# vhost(例)
# SSLCertificateFile      /etc/ssl/certs/example.com.fullchain.pem
# SSLCertificateKeyFile   /etc/ssl/private/example.com.key

systemctl reload apache2 || systemctl reload httpd

ファイル名の注意
lego の example.com.crt は「サーバ証明書+中間証明書の連結(fullchain)」です。多くの環境でそのまま fullchain として利用できます。

7. 自動更新(cron / systemd)

lego は renew を定期実行します。満了が近い証明書のみ更新されます。

cron 例(毎日 3:10)

sudo crontab -e
10 3 * * * lego --server 管理画面で取得したACMEサーバURL \
  --path /opt/lego \
  --email admin@example.com \
  --eab --kid <EAB_KID> --hmac <EAB_HMAC_KEY> \
  renew --days 30 --renew-hook "systemctl reload nginx || systemctl reload apache2"

systemd で環境変数を安全に渡す(例)

# /etc/systemd/system/lego-renew.service
[Unit]
Description=lego renew

[Service]
Type=oneshot
EnvironmentFile=/etc/lego/env   # EAB/TOKEN をここに(600)
ExecStart=/usr/local/bin/lego --server 管理画面で取得したACMEサーバURL --path /opt/lego --email admin@example.com --eab --kid %EAB_KID% --hmac %EAB_HMAC_KEY% renew --days 30 --renew-hook "systemctl reload nginx || systemctl reload apache2"

# /etc/systemd/system/lego-renew.timer
[Unit]
Description=Run lego renew daily

[Timer]
OnCalendar=03:10
Persistent=true

[Install]
WantedBy=timers.target

/etc/lego/env600 / root:root で保存し、平文でリポジトリに入れないこと。

8. DNS 設定の要点

  • HTTP-01:対象 FQDN の A/AAAA が発行サーバに向いていること。/.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

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

  • HTTP-01 失敗:80/TCP 未開放、CDN がチャレンジをキャッシュ、リライトで別ドメインへ。→ 素通し・一時的に「DNS only」へ。
  • DNS-01 失敗:TXT 値の余分な引用符/空白、委任ゾーンの編集漏れ。→ 伝播完了をパブリックDNSで確認。
  • 権限エラー:設置先への書込/参照権限不足。秘密鍵は 600(Apache は 640 + chgrp)。
  • 原因追跡:--verbose を付与し、lego の出力と権限/ファイアウォール/ログを確認。
# 例:詳細表示で再試行(HTTP-01 Webroot)
sudo lego --server 管理画面で取得したACMEサーバURL \
  --path /opt/lego \
  --eab --kid <EAB_KID> --hmac <EAB_HMAC_KEY> \
  --email admin@example.com \
  --http --http.webroot /var/www/html \
  --domains example.com --domains www.example.com \
  run --verbose

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

# 既存証明書の更新(即時)
lego --server 管理画面で取得したACMEサーバURL --path /opt/lego renew --days 90 --no-hook

# 単一ドメインだけ更新
lego --server 管理画面で取得したACMEサーバURL --path /opt/lego --domains example.com renew --days 30

# アカウント/証明書の場所表示
tree /opt/lego -L 2

# 失効(必要時のみ)
lego --server 管理画面で取得したACMEサーバURL --path /opt/lego revoke --cert /opt/lego/certificates/example.com.crt

よく読まれている質問