acme.sh SSL証明書 自動更新 設定手順書


対象OS Ubuntu 20.04/22.04/24.04、Debian 11/12、RHEL 8/9/10、AlmaLinux 8/9/10、Rocky Linux 8/9/10
Webサーバ Apache / Nginx
ACMEクライアント acme.sh
認証方式 HTTP-01(webrootモード)

概要

acme.sh とは

acme.sh は Pure Shell Script で実装された軽量なACMEクライアントです。Python や Node.js などのランタイムが不要で、curl(または wget)だけで動作します。

項目 acme.sh Certbot
実装 Pure Shell Script Python
外部依存 curl / wget のみ Python ランタイム必要
インストール スクリプト1本 snap / apt / dnf
Webサーバ設定の自動変更 行わない(証明書取得のみ) プラグインで自動変更可
自動更新の管理 cron(自動登録) systemd timer

webrootモードの仕組み

ACMEサーバからのチャレンジファイルを既存Webサーバのドキュメントルート配下に配置することで、ドメインの所有権を証明します。Webサーバを停止する必要はありません。

① acme.sh

チャレンジファイルを /.well-known/acme-challenge/ に配置

② ACMEサーバ

HTTP経由でファイルにアクセスし、ドメイン所有権を検証

③ 証明書発行

検証成功により証明書を発行

事前準備・前提条件

項目 内容
ドメイン 証明書を取得するFQDN(例:example.com)が確定していること
DNSレコード AレコードがサーバのグローバルIPを向いていること
80番ポート 外部からHTTPアクセス(TCP/80)が到達できること
Webサーバ動作 Apache または Nginx が稼働していること
認証局情報 ACME Server URL / Key ID / HMAC Key がSSLセキュア管理画面から取得済みであること
curl または wget インストール済みであること

🟠 = Ubuntu/Debian向け手順 🔴 = RHEL/AlmaLinux/Rocky Linux向け手順 (表記なし = 共通)

設定手順

太字部分はお申込み内容に合わせて適宜読み替えてください。

STEP 1依存パッケージのインストール


sudo apt update
sudo apt install -y curl socat

sudo dnf install -y curl socat

STEP 2acme.sh のインストール

# メールアドレスは管理者のものに変更してください
curl https://get.acme.sh | sh -s email=<:管理者メールアドレス>:

# シェルを再読み込み
source ~/.bashrc

# バージョン確認
acme.sh --version
インストール先は ~/.acme.sh/ です。cron への自動登録も同時に行われます(crontab -l で確認できます)。

STEP 3EAB情報の確認

SSLセキュアの管理画面から以下の情報を取得してください。

パラメータ 説明
ACME Server URL 認証局のACMEエンドポイントURL(例:https://acme.example-ca.com/acme/directory
Key ID EAB用のキーID(アカウント識別子)
HMAC Key EAB用のHMAC秘密鍵(Base64URL形式)
⚠ HMAC Key は秘密情報です。ファイルに保存する場合は chmod 600 で権限を制限してください。

STEP 4ファイアウォールの確認


sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

STEP 5認証局(CA)の登録

acme.sh --register-account \
  --server <ACME Server URL> \
  --eab-kid  "<Key ID>" \
  --eab-hmac-key "<HMAC Key>"
成功時の出力例
[info] Registering account: <ACME Server URL>
[info] Registered
[info] ACCOUNT_THUMBPRINT='xxxxxxxxxxxxxxxxxxxx'

STEP 6webroot ディレクトリの設定

チャレンジディレクトリの作成
sudo mkdir -p /var/www/html/.well-known/acme-challenge
sudo chown -R $USER:$USER /var/www/html/.well-known
Apache の設定確認

sudo cat /etc/apache2/sites-enabled/000-default.conf

sudo cat /etc/httpd/conf.d/vhost.conf

Nginx の設定確認・追記

# /etc/nginx/sites-available/<ドメイン名> の server ブロックに追記
location /.well-known/acme-challenge/ {
    root /var/www/html;
}
sudo nginx -t && sudo systemctl reload nginx

# /etc/nginx/conf.d/<ドメイン名>.conf の server ブロックに追記
location /.well-known/acme-challenge/ {
    root /var/www/html;
}
sudo nginx -t && sudo systemctl reload nginx

動作確認
echo "ok" | tee /var/www/html/.well-known/acme-challenge/test.txt
curl http://<ドメイン名>/.well-known/acme-challenge/test.txt
# "ok" と表示されれば問題なし
rm /var/www/html/.well-known/acme-challenge/test.txt
⚠ 🔴 RedHat系で 403 エラーが出る場合は SELinux が原因の可能性があります。sudo restorecon -Rv /var/www/html/.well-known/ を実行してください。

STEP 7証明書の取得(初回)

acme.sh --issue \
  --server <ACME Server URL> \
  -d <ドメイン名> \
  -d www.<ドメイン名> \
  --webroot /var/www/html
デフォルトの鍵タイプはECC(ec-256)です。RSAが必要な場合は --keylength 2048 を追加してください。

STEP 8証明書のインストール(Webサーバへの配置)

acme.sh では証明書の取得(--issue)と、Webサーバへの配置(--install-cert)を分けて行います。--reloadcmd に指定したコマンドは自動更新のたびに実行されます。

# 配置先ディレクトリを作成
sudo mkdir -p /etc/ssl/<ドメイン名>
Apache の場合

acme.sh --install-cert \
  -d <ドメイン名> \
  --cert-file      /etc/ssl/<ドメイン名>/cert.pem \
  --key-file       /etc/ssl/<ドメイン名>/privkey.pem \
  --fullchain-file /etc/ssl/<ドメイン名>/fullchain.pem \
  --reloadcmd      "systemctl reload apache2"
# /etc/apache2/sites-available/<ドメイン名>-ssl.conf を作成
<VirtualHost *:443>
    ServerName <ドメイン名>
    DocumentRoot /var/www/html
    SSLEngine on
    SSLCertificateFile    /etc/ssl/<ドメイン名>/cert.pem
    SSLCertificateKeyFile /etc/ssl/<ドメイン名>/privkey.pem
    SSLCertificateChainFile /etc/ssl/<ドメイン名>/fullchain.pem
</VirtualHost>

sudo a2enmod ssl
sudo a2ensite <ドメイン名>-ssl.conf
sudo systemctl reload apache2

acme.sh --install-cert \
  -d <ドメイン名> \
  --cert-file      /etc/ssl/<ドメイン名>/cert.pem \
  --key-file       /etc/ssl/<ドメイン名>/privkey.pem \
  --fullchain-file /etc/ssl/<ドメイン名>/fullchain.pem \
  --reloadcmd      "systemctl reload httpd"
# mod_ssl のインストール(未導入の場合)
sudo dnf install -y mod_ssl

# /etc/httpd/conf.d/<ドメイン名>-ssl.conf を作成
<VirtualHost *:443>
    ServerName <ドメイン名>
    DocumentRoot /var/www/html
    SSLEngine on
    SSLCertificateFile    /etc/ssl/<ドメイン名>/cert.pem
    SSLCertificateKeyFile /etc/ssl/<ドメイン名>/privkey.pem
    SSLCertificateChainFile /etc/ssl/<ドメイン名>/fullchain.pem
</VirtualHost>

sudo systemctl reload httpd

Nginx の場合

acme.sh --install-cert \
  -d <ドメイン名> \
  --key-file       /etc/ssl/<ドメイン名>/privkey.pem \
  --fullchain-file /etc/ssl/<ドメイン名>/fullchain.pem \
  --reloadcmd      "systemctl reload nginx"
# /etc/nginx/sites-available/<ドメイン名> を編集
server {
    listen 443 ssl;
    server_name <ドメイン名>;
    ssl_certificate     /etc/ssl/<ドメイン名>/fullchain.pem;
    ssl_certificate_key /etc/ssl/<ドメイン名>/privkey.pem;
}
sudo ln -s /etc/nginx/sites-available/<ドメイン名>  /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

acme.sh --install-cert \
  -d <ドメイン名> \
  --key-file       /etc/ssl/<ドメイン名>/privkey.pem \
  --fullchain-file /etc/ssl/<ドメイン名>/fullchain.pem \
  --reloadcmd      "systemctl reload nginx"
# /etc/nginx/conf.d/<ドメイン名>-ssl.conf を作成
server {
    listen 443 ssl;
    server_name <ドメイン名>;
    ssl_certificate     /etc/ssl/<ドメイン名>/fullchain.pem;
    ssl_certificate_key /etc/ssl/<ドメイン名>/privkey.pem;
}
# conf.d は自動読み込みのためシンボリックリンク不要
sudo nginx -t && sudo systemctl reload nginx

STEP 9自動更新の確認

# cron の確認
crontab -l

# 強制更新テスト
acme.sh --renew \
  -d <ドメイン名> \
  --server <ACME Server URL> \
  --force
acme.sh は証明書の有効期限が残り30日を切った場合にのみ更新を実行します。--force を付けると期限に関わらず強制更新できます。

動作確認

# 証明書の一覧確認
acme.sh --list

# 証明書の内容確認
openssl x509 -in /etc/ssl/<ドメイン名>/cert.pem \
  -noout -text | grep -E "Subject:|Issuer:|Not After"

# HTTPS 接続確認
curl -v https://<ドメイン名> 2>&1 | grep -E "SSL|subject|expire"

トラブルシューティング

エラー内容 原因 対処法
Connection refused (port 80) ファイアウォールが80番をブロック 🟠 ufw allow 80/tcp
🔴 firewall-cmd --add-service=http
Challenge failed: 404 webrootパスの設定ミス --webroot と DocumentRoot が一致するか確認
Challenge failed: 403 SELinux によるアクセス拒否(🔴 RedHat系) restorecon -Rv /var/www/html/.well-known/
EAB registration failed Key ID / HMAC Key が誤り 管理画面で再発行して再登録
Permission denied on webroot webroot への書き込み権限不足 chown -R $USER /var/www/html/.well-known
acme.sh: command not found シェル再読み込み忘れ source ~/.bashrc を実行
cron が登録されていない インストール時にエラーが発生 acme.sh --install-cronjob を実行
詳細なログは ~/.acme.sh/acme.sh.log を参照してください。--debug オプションで詳細出力が得られます。

ディストリビューション別 主要パス・コマンド早見表

項目 🟠 Debian / Ubuntu 🔴 RedHat系
パッケージ管理 apt dnf
Apache サービス名 apache2 httpd
Apache 設定ディレクトリ /etc/apache2/sites-available/ /etc/httpd/conf.d/
Apache SSL モジュール sudo a2enmod ssl sudo dnf install mod_ssl
Nginx 設定ディレクトリ /etc/nginx/sites-available/ /etc/nginx/conf.d/
ファイアウォール ufw firewalld
SELinux 通常無効 有効(要確認)
acme.sh インストール先 ~/.acme.sh/(共通)
証明書格納ディレクトリ ~/.acme.sh/<domain>_ecc/(共通)
ログファイル ~/.acme.sh/acme.sh.log(共通)

ページ上部へ戻る