6. メッセージ転送 (Message Transport)
ACME クライアントと ACME サーバー間の通信は HTTPS を通じて行われ、JSON Web Signature (JWS) [RFC7515] を使用してクライアントからサーバーに送信されるメッセージに追加のセキュリティ特性を提供します。HTTPS はサーバー認証と機密性を提供します。
6.1. HTTPS リクエスト (HTTPS Requests)
各 ACME 機能は、クライアントがサーバーに JSON メッセージを運ぶ一連の HTTPS リクエストを送信することで実現されます。HTTPS の使用は必須です (REQUIRED)。
ACME サーバーは TLS 実装を設定する際に [RFC7525] の推奨事項に従うべきです (SHOULD)。
ACME クライアントは [RFC7231] に従って User-Agent ヘッダーフィールドを送信しなければなりません (MUST)。このヘッダーフィールドには、基礎となる HTTP クライアントソフトウェアの名前とバージョンに加えて、ACME ソフトウェアの名前とバージョンを含めるべきです (SHOULD)。
ACME クライアントはエラーメッセージのローカライズを有効にするために [RFC7231] に従って Accept-Language ヘッダーフィールドを送信すべきです (SHOULD)。
ACME で使用される JSON オブジェクトのバイナリフィールドは、[RFC4648] 第 5 節で説明された base64url エンコーディングを使用してエンコードされます。末尾の「=」文字は削除されなければなりません (MUST)。
6.2. リクエスト認証 (Request Authentication)
空でないボディを持つすべての ACME リクエストは、アカウントの秘密鍵を使用して署名された JWS オブジェクトにペイロードをカプセル化しなければなりません (MUST)。
ACME リクエストボディとして送信される JWS オブジェクトは以下の追加基準を満たさなければなりません (MUST)。
- JWS はフラット化 JSON シリアライゼーション (Flattened JSON Serialization) を採用しなければなりません (MUST)
- JWS は複数の署名を持ってはなりません (MUST NOT)
- JWS 保護ヘッダーには以下のフィールドを含めなければなりません (MUST):
- 「alg」(アルゴリズム)— 「none」や MAC アルゴリズムを含んではなりません (MUST NOT)
- 「nonce」(第 6.5 節で定義)
- 「url」(第 6.4 節で定義)
- 「jwk」または「kid」
ACME サーバーは「ES256」署名アルゴリズム [RFC7518] を実装しなければならず (MUST)、「Ed25519」バリアントを使用する「EdDSA」署名アルゴリズム [RFC8037] を実装すべきです (SHOULD)。
6.3. GET と POST-as-GET リクエスト (GET and POST-as-GET Requests)
クライアントがサーバーからリソースを取得したい場合(通常は GET で行われる)、JWS ボディを持つ POST リクエストを送信しなければなりません (MUST)。JWS のペイロードはゼロ長のオクテット文字列です。
6.4. リクエスト URL の完全性 (Request URL Integrity)
すべての ACME リクエストオブジェクトは保護ヘッダーに「url」ヘッダーパラメーターを持ちます。HTTP リクエストでこのようなオブジェクトを受信した場合、サーバーは「url」ヘッダーパラメーターをリクエスト URL と比較しなければなりません (MUST)。一致しない場合、サーバーはリクエストを未認可として拒否しなければなりません (MUST)。
6.5. リプレイ保護 (Replay Protection)
ACME リソースをリプレイ攻撃から保護するために、ACME POST リクエストには必須のアンチリプレイメカニズムがあります。
ACME サーバーは HTTP Replay-Nonce ヘッダーフィールドを使用してクライアントに nonce を提供します。ACME クライアントが送信するすべての JWS は保護ヘッダーに「nonce」ヘッダーパラメーターを含めなければなりません (MUST)。
サーバーが nonce 値が受け入れられないためにリクエストを拒否する場合、HTTP ステータスコード 400 (Bad Request) と ACME エラータイプ「urn:ietf:params:acme:error:badNonce」を提供しなければなりません (MUST)。
6.6. レート制限 (Rate Limits)
ACME サーバーはリソース作成にレート制限を課す場合があります。レート制限を超えた場合、サーバーはタイプ「urn:ietf:params:acme:error:rateLimited」のエラーで応答しなければなりません (MUST)。
6.7. エラー (Errors)
エラーは HTTP 層とチャレンジオブジェクトで報告できます。サーバーがエラー状態で応答する場合、問題文書 [RFC7807] を使用して追加情報を提供すべきです (SHOULD)。
主なエラータイプには以下が含まれます。
| タイプ | 説明 |
|---|---|
| accountDoesNotExist | リクエストで指定されたアカウントが存在しない |
| badCSR | CSR が受け入れられない |
| badNonce | クライアントが受け入れられないアンチリプレイ nonce を送信した |
| badPublicKey | JWS がサーバーがサポートしない公開鍵で署名されている |
| badSignatureAlgorithm | JWS がサーバーがサポートしないアルゴリズムで署名されている |
| connection | サーバーが検証ターゲットに接続できない |
| dns | 識別子検証中に DNS クエリで問題が発生した |
| malformed | リクエストメッセージの形式が不正 |
| rateLimited | リクエストがレート制限を超えた |
| serverInternal | サーバーが内部エラーに遭遇した |
| unauthorized | クライアントに十分な認可がない |