ACME(Automated Certificate Management Environment)は、無料の自動SSL証明書を可能にするプロトコルです。Let’s EncryptとACMEクライアント(GetHTTPS、Certbot、acme.sh)が認証局と実際に通信する方法です。
RFC 8555で定義されたACMEは、旧来の手動プロセス(CSRをメールで認証局に送り、人間のレビューを待つ)を、完全に自動化された暗号的に安全なプロトコルに置き換えました。
ACMEの仕組み — 5つのステップ
┌──────────┐ ┌──────────────┐
│ Client │ ① Account Registration │ CA Server │
│ (GetHTTPS)│ ──────────────────────────→ │ (Let's Encrypt)
│ │ ② New Order (domains) │ │
│ │ ──────────────────────────→ │ │
│ │ ③ Complete Challenges │ │
│ │ ←─────────────────────────── │ │
│ │ ──────────────────────────→ │ │
│ │ ④ Finalize (send CSR) │ │
│ │ ──────────────────────────→ │ │
│ │ ⑤ Download Certificate │ │
│ │ ←─────────────────────────── │ │
└──────────┘ └──────────────┘
ステップ1: アカウント登録
クライアントがACMEアカウント鍵ペアを生成し、公開鍵を認証局に登録します。この鍵が将来のリクエストであなたを識別します — すべてのACMEメッセージがこの鍵で署名されます。
メール、パスワード、個人情報は不要です。
ステップ2: 新規注文
クライアントが証明書を取得したいドメイン名のリストを送信します。認証局が「注文」を作成し、「認可」のセットを返します — ドメインごとに1つ — 各認可に完了すべきチャレンジが含まれます。
ステップ3: チャレンジの完了
各ドメインについて、クライアントは管理を証明する必要があります。認証局がチャレンジタイプを提供します:
| チャレンジ | 仕組み | ユースケース |
|---|---|---|
| HTTP-01 | /.well-known/acme-challenge/にファイルを配置 | 最も一般的、最もシンプル |
| DNS-01 | _acme-challenge.domainにTXTレコードを追加 | ワイルドカード、ポート80なし |
| TLS-ALPN-01 | ポート443で特殊なTLS証明書で応答 | ポート80がブロック、DNSアクセスなし |
クライアントがチャレンジを完了し、認証局に検証を依頼します。認証局がサーバーからチェックし、チャレンジに合格すれば認可が有効とマークされます。
ステップ4: ファイナライズ(CSR送信)
すべてのドメインが認可された後、クライアントは証明書用の公開鍵を含むCSR(Certificate Signing Request)を送信します。認証局がそれに署名して証明書を作成します。
ステップ5: 証明書のダウンロード
クライアントが署名された証明書チェーン — あなたの証明書 + 中間CA証明書をダウンロードします。完了です。
ACMEセキュリティモデル
すべてのACMEリクエストはアカウント鍵を使用した**JWS(JSON Web Signature)**で署名されます。これにより以下を防止します:
- リプレイ攻撃 — 各リクエストに固有のnonce
- 改ざん — 署名がリクエスト本文全体をカバー
- なりすまし — アカウント鍵の保持者のみがリクエスト可能
アカウント鍵はクライアントを離れません。GetHTTPSではWeb Crypto API経由でブラウザ内で生成されます。
GetHTTPSがACMEをどう使用するか
GetHTTPSはACMEプロトコル全体をブラウザ内で実行されるJavaScriptで実装しています:
crypto.subtle.generateKey()(Web Crypto API)でアカウント鍵を生成- 同じ方法で証明書鍵を生成
crypto.subtle.sign()でACMEメッセージに署名- pkijsライブラリでCSRを構築
acme-v02.api.letsencrypt.orgと直接HTTPS通信
サーバーサイドプロキシやミドルウェアはありません。ブラウザがLet’s EncryptのACME APIと直接通信します。これはユニークです — ほとんどのACMEクライアントはサーバー上で実行されます。
ACMEクライアントの比較
| クライアント | 実行環境 | ACME v2 | 自動更新 | 言語 |
|---|---|---|---|---|
| GetHTTPS | ブラウザ | ✅ | ❌ 手動 | JavaScript |
| Certbot | サーバーCLI | ✅ | ✅ | Python |
| acme.sh | サーバーCLI | ✅ | ✅ | Shell |
| Caddy | Webサーバー | ✅ | ✅ | Go |
| Traefik | リバースプロキシ | ✅ | ✅ | Go |
| Lego | CLIライブラリ | ✅ | ✅ | Go |
ACMEをサポートする認証局
ACMEはLet’s Encryptが作成しましたが、現在は複数の認証局が使用するオープン標準です:
| 認証局 | ACMEディレクトリURL | 無料? |
|---|---|---|
| Let’s Encrypt | acme-v02.api.letsencrypt.org/directory | ✅ |
| ZeroSSL | acme.zerossl.com/v2/DV90 | 限定的な無料 |
| Buypass | api.buypass.com/acme/directory | ✅ |
| Google Trust Services | Google Cloud ACME経由 | ✅ |
| DigiCert | エンタープライズACMEエンドポイント | 有料 |
| Sectigo | エンタープライズACMEエンドポイント | 有料 |
よくある質問
ACMEとLet’s Encryptは同じですか?
いいえ。ACMEはプロトコル(RFC 8555)です。Let’s EncryptはACMEを使用する認証局です。他の認証局(ZeroSSL、Buypass、Google)もACMEをサポートしています。HTTPとGoogleの関係のようなものです — HTTPはプロトコル、Googleはそれを使用するサービスです。
自分のACMEクライアントを実装できますか?
はい。プロトコルはRFC 8555で完全に仕様化されています。GetHTTPSはブラウザベースの実装の例です。ほとんどの言語にライブラリがあります(PythonのCertbot、GoのLego、JavaScriptのacme.js)。
ACME v2とは何ですか?
ACME v2は現在のバージョン(RFC 8555)で、ワイルドカード証明書のサポートを追加し、ドラフトv1プロトコルを置き換えました。すべての最新ACMEクライアントはv2を使用しています。Let’s Encryptは2021年にv1エンドポイントを終了しました。
ACMEサーバーがダウンしたらどうなりますか?
既存の証明書は動作し続けます(自宅に電話しません)。サーバーが復旧するまで発行や更新ができないだけです。Let’s Encryptは高い稼働時間と冗長なインフラを持っています。