I’m attempting to troubleshoot an issue submitted to my project from a user trying to use the client against an internal non-Boulder based ACME server called Nexus Certificate Manager.
The root of the problem is that the challenges inside the authorization objects returned by the server don’t contain a status
field. My client basically throws an exception when it can’t find that status field. Here’s an example:
{
"status": "pending",
"expires": "2020-03-16T07:27:24.928304Z",
"identifier": {
"type": "dns",
"value": "win.company.test"
},
"challenges": [
{
"type": "http-01",
"url": "https://pgwy.company.test/acme/orders/cKuv-ie0v9qxJ8h-joZ8Qg/authz/oUpOANAEpeAvJW5I8Gp05Q/http-01",
"token": "YvW2iZCps1sdCW-nR70C_w"
},
{
"type": "dns-01",
"url": "https://pgwy.company.test/acme/orders/cKuv-ie0v9qxJ8h-joZ8Qg/authz/oUpOANAEpeAvJW5I8Gp05Q/dns-01",
"token": "YvW2iZCps1sdCW-nR70C_w"
}
]
}
According to RFC8555 section 8, status
is a required field in all challenge objects. So at first glance, I’d say my client is adhering to the spec and the user should get the Nexus CM vendor to fix their implementation. However, the user claims other clients such as certbot don’t seem to have a problem with it.
So I’m left wondering. Was challenge status not always a requirement in earlier drafts of the spec? What do clients like certbot do in this situation? Do they just assume all challenge status fields match the parent authorization’s status? Should I alter my client to more gracefully deal with non-compliant servers in general?