1. lego v5 を配置
公式の GitHub Releases から Linux amd64 版を取得し、/usr/local/bin/lego-v5 に配置します。
※64bit 系 Linux の例です。ご自身の環境に応じて適切なバージョンを配置してください。
sudo curl -fL "https://github.com/go-acme/lego/releases/download/v5.2.2/lego_v5.2.2_linux_amd64.tar.gz" -o lego.tgz
TMP_LEGO_DIR="$(mktemp -d)"
sudo tar -xzf lego.tgz --no-same-owner -C "$TMP_LEGO_DIR" lego
sudo install -o root -g root -m 755 "$TMP_LEGO_DIR/lego" /usr/local/bin/lego-v5
sudo rm -rf "$TMP_LEGO_DIR"
sudo rm lego.tgz
sudo /usr/local/bin/lego-v5 --version
2. 新規発行
HTTP-01 では、対象FQDNの /.well-known/acme-challenge/ が外部から参照できる必要があります。
CDN、リバースプロキシ、リダイレクト設定を使っている場合は、認証パスが素通しされるようにしてください。
Apache のサービス名は環境に応じて httpd または apache2 に読み替えてください。
sudo \
/usr/local/bin/lego-v5 run \
--http \
--http.webroot "/var/www/docs/www.domain-keeper.net" \
--path "/etc/SSL1234567-www.domain-keeper.net" \
--cert.name "www.domain-keeper.net" \
-d "www.domain-keeper.net" \
-d "domain-keeper.net" \
--eab \
--kid "EXAMPLEKID" \
--hmac "EXAMPLEHMAC" \
--server "https://acme.amecert.jprs.jp/DV/getDirectory" \
--key-type rsa2048 \
--accept-tos \
--email "example@domain-keeper.net" \
--no-bundle \
--deploy-hook "systemctl reload httpd"
3. 証明書保存ディレクトリ
--path で指定したディレクトリ配下に、アカウント情報、証明書、秘密鍵が保存されます。
証明書
/etc/SSL1234567-www.domain-keeper.net/certificates/www.domain-keeper.net.crt
中間証明書
/etc/SSL1234567-www.domain-keeper.net/certificates/www.domain-keeper.net.issuer.crt
秘密鍵
/etc/SSL1234567-www.domain-keeper.net/certificates/www.domain-keeper.net.key
--no-bundle を指定しているため、lego の .crt はサーバ証明書のみです。
中間証明書は .issuer.crt を指定します。Webサーバ側で証明書チェーンを1ファイルで指定する必要がある場合は、
サーバ証明書と中間証明書を結合したファイルを別途作成してください。
4. Cronによる自動更新
初回発行後は --path 配下にアカウント情報が保存されます。
Cron 例では保存済みの情報を使い、残り日数が30日以下になった場合だけ更新します。
sudo tee /etc/cron.d/SSL1234567-www.domain-keeper.net-lego >/dev/null <<'EOF'
0 3 * * * root mkdir -p /var/log/lego && /usr/local/bin/lego-v5 run --http --http.webroot "/var/www/docs/www.domain-keeper.net" --path "/etc/SSL1234567-www.domain-keeper.net" --cert.name "www.domain-keeper.net" -d "www.domain-keeper.net" -d "domain-keeper.net" --server "https://acme.amecert.jprs.jp/DV/getDirectory" --key-type rsa2048 --accept-tos --email "example@domain-keeper.net" --renew-days 30 --no-bundle --no-random-sleep --deploy-hook "systemctl reload httpd" >>/var/log/lego/SSL1234567-www.domain-keeper.net.log 2>&1
EOF
sudo chmod 600 /etc/cron.d/SSL1234567-www.domain-keeper.net-lego
sudo chown root:root /etc/cron.d/SSL1234567-www.domain-keeper.net-lego
5. 主な指定の役割
上記「2. 新規発行」のコマンドに含まれる指定の意味は次のとおりです。
run: 証明書の新規発行、または更新条件を満たす場合の更新を行います。
--http: HTTP-01 認証を使う指定です。
--http.webroot: 認証ファイルを書き込むWeb公開ディレクトリです。lego 内蔵 HTTP サーバは使いません。
--path: アカウント情報、証明書、秘密鍵を保存するディレクトリです。
--cert.name: lego 内で証明書を識別する名前です。保存ファイル名にも反映されます。
-d: 証明書に含める FQDN です。複数行で SAN を追加できます。
--eab: 外部アカウント連携(EAB)を使う指定です。初回アカウント登録時に必要です。
--kid: EAB の KID です。
--hmac: EAB の HMAC キーです。
--server: 接続先の ACME ディレクトリ URL です。
--key-type rsa2048: RSA 2048 ビットの秘密鍵を使う指定です。
--accept-tos: 認証局の利用規約への同意を示します。
--email: 認証局への連絡先メールアドレスです。
--no-bundle: サーバ証明書(.crt)と中間証明書(.issuer.crt)を別ファイルで保存します。
--deploy-hook: 発行または更新成功後に実行するコマンドです。
「4. Cronによる自動更新」の例では、次の指定を追加しています。
--renew-days 30: 残り有効日数が 30 日以下の証明書だけ更新します。
--no-random-sleep: 更新開始前のランダム待機を行いません。Cron 実行時刻を固定したい場合に使います。
Cron 例では初回登録済みのため --eab / --kid / --hmac は省略しています。
6. 確認ポイント
/.well-known/acme-challenge/ へのHTTPアクセスが外部から到達すること。
--http.webroot で指定したディレクトリが、対象FQDNのDocumentRootと一致していること。
- hook で実行する
systemctl reload httpd が対象サーバで正常に動くこと。
- Cronの登録内容と更新ログを確認できること。
公式サイト:
GitHub Releases
/
CLI Options