I’m not aware of a stand-alone tool but the Go ACME client “Lego” has a disableAuthz function it uses internally for this purpose that might be a useful reference:
To be explicit I haven't tried using Lego for this, I just knew it existed. Totally possible it's buggy!
This is a URL for the challenge endpoint - you need to be posting to the authz endpoint. An authorization is a higher level object that contains references to individual challenges. I'd expect the URL you provide to be of the form:
This error is because the signed JWS body's resource value (authz) does not match the endpoint you're POSTing. This check is done because otherwise ACME would be open to subtle attacks that may take a signed JWS body from one request to use it against a different endpoint.
One potential workaround I just remembered: If you send a GET request to a challenge URL you should get back a JSON response body with an additional Link HTTP response header with the rel=up pointing at the Authz, like so:
That should be sufficient to find the authz URL for the challenge URL's you have logged with a bit of extra work.
I think this "Up" relation might be removed in the latest versions of the draft ACME specification but it will continue to work with the existing Boulder implementation for the time being.
$ acmecancel "https://acme-v01.api.letsencrypt.org/acme/authz/XXX"
$ acmecancel "https://acme-v01.api.letsencrypt.org/acme/authz/XXX"
acmecancel: could not disable authz: Error deactivating authorization :: only valid and pending authorizations can be deactivated
So it looks like it’s not pending anymore, but the corresponding challenge still says its pending.
That's correct. An authorization has one or more challenges (For LE right now it's three challenges per authz: DNS-01, TLS-SNI-01 and HTTP-01). If your client solves one challenge (say HTTP-01), then that specific HTTP-01 challenge will be set to VALID while the DNS-01 and TLS-SNI-01 challenges will remain PENDING since they are unsolved. The authz will be set to VALID as soon as one challenge is VALID.
In general clients should concern themselves with authz state as opposed to individual challenge state since authz's can be reused in some conditions and clients can be confused when they request a new authz to do say, a DNS-01 challenge, but get back an already valid authz that was validated by HTTP-01 at a prior date and has a PENDING DNS-01 challenge.
I think this is an implementation decision of Let's Encrypt/Boulder and not mandated by the ACME protocol. You might run into trouble in the future if you rely on this and the tool is used against a different CA implementing ACME.
The tool now expects an authz URL. It's the user's responsibility to do any transformation or lookup to get the authz URL. I'm also the only user right now so I think it will be fine.