すべての SSL 記事 SSL と証明書

ACMEプロトコルとは?

ACME(Automated Certificate Management Environment)は、無料の自動SSL証明書を可能にするプロトコルです。Let’s EncryptとACMEクライアント(GetHTTPSCertbotacme.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で実装しています:

  1. crypto.subtle.generateKey()(Web Crypto API)でアカウント鍵を生成
  2. 同じ方法で証明書鍵を生成
  3. crypto.subtle.sign()でACMEメッセージに署名
  4. pkijsライブラリでCSRを構築
  5. acme-v02.api.letsencrypt.orgと直接HTTPS通信

サーバーサイドプロキシやミドルウェアはありません。ブラウザがLet’s EncryptのACME APIと直接通信します。これはユニークです — ほとんどのACMEクライアントはサーバー上で実行されます。

ACMEクライアントの比較

クライアント実行環境ACME v2自動更新言語
GetHTTPSブラウザ❌ 手動JavaScript
CertbotサーバーCLIPython
acme.shサーバーCLIShell
CaddyWebサーバーGo
TraefikリバースプロキシGo
LegoCLIライブラリGo

完全な比較 →

ACMEをサポートする認証局

ACMEはLet’s Encryptが作成しましたが、現在は複数の認証局が使用するオープン標準です:

認証局ACMEディレクトリURL無料?
Let’s Encryptacme-v02.api.letsencrypt.org/directory
ZeroSSLacme.zerossl.com/v2/DV90限定的な無料
Buypassapi.buypass.com/acme/directory
Google Trust ServicesGoogle 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は高い稼働時間と冗長なインフラを持っています。

関連記事

SSL と証明書 2026-05-07
Let's Encryptとは?
Let's Encryptは10億枚以上のSSL証明書を発行した無料の非営利認証局です。仕組み、レート制限、GetHTTPSでの使用方法を解説します。
はじめに 2026-05-08
HTTP-01チャレンジ:仕組みと完了方法
HTTP-01はSSL証明書のドメイン所有権証明として最もシンプルな方法です。サーバーにファイルを配置し、Let's Encryptが検証して証明書を発行します。
はじめに 2026-05-08
DNS-01チャレンジ:仕組みと完了方法
DNS-01検証はDNSにTXTレコードを追加してドメインの所有権を証明します。ワイルドカード証明書に必須です。Cloudflare、Route 53、GoDaddy、Namecheapなどでの設定方法を解説します。
SSL と証明書 2026-05-07
SSL/TLSの仕組み:TLSハンドシェイクの解説
TLSハンドシェイクのビジュアルウォークスルー。ブラウザとサーバーがミリ秒で暗号化接続を確立する方法を解説。TLS 1.2、TLS 1.3、セッション再開、前方秘匿性をカバーします。
ブラウザで無料 SSL 証明書を取得
インストール不要、アカウント不要。秘密鍵は常にデバイスに残ります。
証明書を取得