8. 識別子検証チャレンジ (Identifier Validation Challenges)
チャレンジはサーバーに、アカウント保有者が識別子を制御するエンティティでもあるという保証を提供します。各タイプのチャレンジについて、エンティティがチャレンジを正常に完了するためには、エンティティが同時に以下を行う必要があります。
- チャレンジに応答するために使用されるアカウントキーペアの秘密鍵を保持する
- 問題の識別子を制御する
ACME は識別子検証のための拡張可能なチャレンジ/レスポンスフレームワークを使用します。
チャレンジオブジェクトにはすべて以下の基本フィールドが含まれます。
type(必須、文字列): オブジェクトにエンコードされたチャレンジのタイプ。
url(必須、文字列): レスポンスを POST できる URL。
status(必須、文字列): このチャレンジのステータス。可能な値は「pending」「processing」「valid」「invalid」です。
validated(オプション、文字列): サーバーがこのチャレンジを検証した時刻。
error(オプション、オブジェクト): サーバーがチャレンジを検証する際に発生したエラー(ある場合)。
8.1. キー認可 (Key Authorizations)
本文書で定義されたすべてのチャレンジはキー認可文字列を使用します。キー認可はチャレンジのトークンとキーフィンガープリントを「.」文字で区切って連結した文字列です。
keyAuthorization = token || '.' || base64url(Thumbprint(accountKey))
8.2. チャレンジの再試行 (Retrying Challenges)
クライアントはサーバーのクエリが成功すると確信するまでチャレンジに応答すべきではありません (SHOULD NOT)。サーバーの初期検証クエリが失敗した場合、サーバーはしばらく後にクエリを再試行すべきです (SHOULD)。
8.3. HTTP チャレンジ (HTTP Challenge)
HTTP 検証では、ACME トランザクションのクライアントは、そのドメイン名の下でアクセス可能なサーバーに HTTP リソースを設定できることを証明することでドメイン名の制御を証明します。
type(必須、文字列): 文字列「http-01」。
token(必須、文字列): チャレンジを一意に識別するランダムな値。この値は少なくとも 128 ビットのエントロピーを持たなければなりません (MUST)。
{
"type": "http-01",
"url": "https://example.com/acme/chall/prV_B7yEyA4",
"status": "pending",
"token": "LoqXcYV8q5ONbJQxbmR7SCTNo3tiAXDfowyjxAjEuX0"
}
クライアントはチャレンジの「token」値とクライアントのアカウントキーからキー認可を構築することでこのチャレンジを完了します。次に、クライアントはキー認可を問題のドメイン名の HTTP サーバーのリソースとして設定します。
リソースを設定するパスは固定プレフィックス「/.well-known/acme-challenge/」とチャレンジの「token」値で構成されます。
GET /.well-known/acme-challenge/LoqXcYV8...jxAjEuX0
Host: example.org
HTTP/1.1 200 OK
Content-Type: application/octet-stream
LoqXcYV8...jxAjEuX0.9jg46WB3...fm21mqTI
8.4. DNS チャレンジ (DNS Challenge)
検証される識別子がドメイン名の場合、クライアントは特定の検証ドメイン名に指定された値を含む TXT リソースレコードを設定することでドメイン名の制御を証明できます。
type(必須、文字列): 文字列「dns-01」。
token(必須、文字列): チャレンジを一意に識別するランダムな値。
{
"type": "dns-01",
"url": "https://example.com/acme/chall/Rg5dV14Gh1Q",
"status": "pending",
"token": "evaGxfADs6pSRb2LAv9IZf17Dt3juxGJ-PCt92wr-oA"
}
クライアントはチャレンジの「token」値とクライアントのアカウントキーからキー認可を構築します。次に、クライアントはキー認可の SHA-256 ダイジェストを計算します。
DNS に設定されるレコードにはこのダイジェストの base64url エンコードが含まれます。クライアントは検証されるドメイン名の前にラベル「_acme-challenge」を付加して検証ドメイン名を構築し、そのダイジェスト値を持つ TXT レコードをその名前の下に設定します。
_acme-challenge.www.example.org. 300 IN TXT "gfj9Xq...Rg85nM"
DNS チャレンジを検証するために、サーバーは以下のステップを実行します。
- 保存されたキー認可の SHA-256 ダイジェストを計算する
- 検証ドメイン名の TXT レコードをクエリする
- TXT レコードの 1 つの内容がダイジェスト値と一致することを検証する