Skip to content

Latest commit

 

History

History
103 lines (54 loc) · 7 KB

acme-divergences.md

File metadata and controls

103 lines (54 loc) · 7 KB

Boulder divergences from ACME

While Boulder attempts to implement the ACME specification as strictly as possible there are places at which we will diverge from the letter of the specification for various reasons.

This document details these differences, since ACME is not yet finalized it will be updated as numbered drafts are published.

Current draft: draft-ietf-acme-acme-05.

Boulder does not implement the general JWS syntax, but only accepts the flattened syntax.

Boulder enforces the presence of the jwk field in JWS objects, and does not support the kid field.

Boulder does not use the url field from the JWS protected resource. Instead Boulder will validate the resource field from the JWS payload matches the resource being requested. Boulder implements the resource types described in draft-ietf-acme-02 Section 6.1 plus the additional "KeyChange" resource. Boulder verifies the resource field contains the /directory URI for the requested resource.

Boulder does not provide a Retry-After header when a user hits a rate-limit, nor does it provide Link headers to further documentation on rate-limiting.

Boulder doesn't return errors under the urn:ietf:params:acme:error: namespace but instead uses the urn:acme:error: namespace from draft-ietf-acme-01 Section 5.4.

Boulder uses invalidEmail in place of the error invalidContact defined in draft-ietf-acme-01 Section 5.4.

Boulder does not implement the caa and dnssec errors.

Boulder does not implement the new-order resource. Instead of new-order Boulder implements the new-cert resource that is defined in draft-ietf-acme-02 Section 6.5.

Boulder also doesn't implement the new-nonce endpoint.

Boulder implements the new-account ressource only under the new-reg key.

Boulder implements Link: rel="next" headers from new-reg to new-authz, and new-authz to new-cert, as specified in draft-02, but these links are not provided in the latest draft, and clients should use URLs from the directory instead.

Boulder does not implement the meta field returned by the directory endpoint.

Boulder does not implement the terms-of-service-agreed or orders fields in the registration object (nor the endpoints the latter links to).

Boulder does not implement orders, instead it implements the new-cert flow from draft-ietf-acme-02 Section 6.5. Instead of authorizations in the order response, Boulder currently uses authorizations that are created using the new-authz flow from draft-ietf-acme-02 Section 6.4.

Boulder does not implement the scope field in authorization objects.

Boulder doesn't implement the new-nonce endpoint, instead it responds to HEAD requests with a valid Replay-Nonce header per draft-ietf-acme-03 Section 5.4.

Boulder only allows mailto URIs in the registrations contact list.

Boulder uses an HTTP status code 409 (Conflict) response for an already existing registration instead of 200 (OK). Boulder returns the URI of the already existing registration in a Location header field instead of a Content-Location header field.

Boulder does not return the status field.

Boulder implements draft-05 style key roll-over with a few divergences. Since Boulder doesn't currently use the registration URL to identify users we do not check for that field in the JWS protected headers but do check for it in the inner payload. Boulder also requires the outer JWS payload contains the "resource": "key-change" field.

Boulder does not implement orders, instead it implements the new-cert flow from draft-ietf-acme-02 Section 6.5. Instead of authorizations in the order response, Boulder currently uses authorizations that are created using the new-authz flow from draft-ietf-acme-02 Section 6.4. Certificates are not proactively issued, a user must request issuance via the new-cert endpoint instead of assuming a certificate will be created once all required authorizations are validated.

Boulder ignores the existing field in authorization request objects.

Boulder returns an uri instead of an url field in challenge objects.

Boulder uses an HTTP status code 202 (Accepted) response for correct challenge responses instead of 200 (OK) as defined in Section 6.1.

Boulder implements tls-sni-01 from draft-ietf-acme-01 Section 7.3 instead of the tls-sni-02 validation method.

Boulder does not implement the oob-01 validation method.

Boulder uses the urn:acme: namespace from draft-ietf-acme-01 Section 5.4 for errors instead of urn:ietf:params:acme:.