コンテンツにスキップ

開発者:ナレッジ:ACME(アクミー)ってなに?

いい着眼点ですね!
Let's Encryptが無料で証明書を発行できるのは、ACMEというプロトコルが使われているからという点が大きいでしょう。
これは非常に画期的なもので、今ではRFCにも載っています。

ACMEとは

ACME(Automatic Certificate Management Environment、日本語では自動証明書管理環境、アクミー)は証明書を自動で発行するために使われるプロトコルです。

ACMEは、以下のような特徴を持っています。

  1. 自動!:普通に証明書を発行しようとすると、やれCSRを作成しろ、やれDNS認証しろ、やれメール認証しろと面倒なことが多いです。ACMEはこんな引くほどだるいことを自動でやってくれます。加えて、大半の場合はその場で証明書が発行できます。ついでに、証明書の更新(Let's Encryptは90日)も自動で行えます。いやー、至れり尽くせりですね。
  2. 標準的!:ACMEは晴れて(RFC8555)に載りました!情報も多く出そろっているので、実装もしやすいでしょう。
  3. 簡単!:ACMEは種類にもよりますが普通のHTTPを使えます。仕組みも種類によっては比較的単純で、理解もしやすいはずです。
  4. 安心!:やばい!証明書が漏洩した!というとき、ACMEは証明書の失効を簡単に行えます。(ここだけの話、ChromeやEdgeではほとんどOCSPをやってくれないためCRLが有効に機能しているかはかなり疑問です。ただ、FirefoxとSafariは律儀にも検証してくれているので、全くの無意味ではないと信じたいところです。)

ACMEによって証明書を発行する手順としくみ

ACMEには、途中の手順にいくつかの方法が選べます。用途によって選べるので、使い分けるといいでしょう。
以下に代表的なHTTP-01DNS-01を紹介します。(TLS-ALPN-01は面倒なので省きます)

HTTP-01(HTTPを使った認証)

HTTP-01は、HTTPサーバを使って認証を行います。
仕組みも簡単ですので、使いやすいでしょう。
ざっとした流れは以下の通りです

  1. ACMEクライアントが、証明書を発行するためのリクエストを送信する。(CSR(Certificate Signing Request・証明書署名要求)を含む)
  2. 認証局(今回はLet's Encrypt)が、受け取ったリクエストに対して、認証を行うためのトークン(文字列)を返してくれる。
  3. 情報を受け取ったACMEクライアントは、その情報をHTTPサーバ(通常 .well-known/acme-challenge/(発行されたトークン) 以下)に配置する。
  4. ファイルの準備が整ったら、ACMEクライアントが認証局にこのことを通知する。
  5. 認証局が、HTTPサーバにアクセスして、トークンが配置されているか取得しにくる。
  6. 認証局がトークンを取得・検証に成功したら、証明書を発行する。
  7. Enjoy!

DNS-01(DNSレコードを使った認証)

DNS-01は、DNSのレコードを使って認証を行います。
DNSのレコードをリアルタイムで変更しなければならないため、ハードルは若干高いです。

  1. ACMEクライアントが、証明書を発行するためのリクエストを送信する。(CSR(Certificate Signing Request・証明書署名要求)を含む)
  2. 認証局(今回はLet's Encrypt)が、受け取ったリクエストに対して、認証を行うためのトークン(文字列)を返してくれる。
  3. 情報を受け取ったACMEクライアントは、その情報を権威DNSサーバのTXTレコードに配置する。
  4. レコードの準備が整ったら、ACMEクライアントが認証局にこのことを通知する。
  5. 認証局が、DNSサーバのTXTレコードへアクセスして、配置したトークンを確認する。
  6. 認証局がトークンを取得・検証に成功したら、証明書を発行する。
  7. Enjoy!

ディスりたくはないですが、DNS経由のDCVは面倒で(今回は)メリットがありません。

DNS-01はDNSを利用するDCVであり、その認証の都度リアルタイムでDNSレコードを変更する必要があります。 自動化されたDNS利用のDCVに対応させるためには、DNSサーバがAPI的な方法でDNSレコードを変更させることに対応していないとただでさえ面倒な実装が、より面倒になります。

ワイルドカード証明書が得られるといったメリットも確実に存在していますが、より簡単なHTTP-01が用意されているのにわざわざDNS-01を選ぶ理由はあまりないでしょう。

どっちを使うべき?

上で述べているとおり、HTTP-01で良いでしょう。
今回の用途でDNS-01を使うのは、単に足かせを自分で作るようなものです。

このドキュメントとしても、今後はHTTP-01を使うことを前提としてDNS-01には触れません。

DNS-01を選ぶ勇者を止めはしない...