Background (so I don't get mobbed..). I am a developer and working on implementing / writing an ACME client (very isolated purpose) for a couple of environments where software written in-house is preferred or audited code. I am actually trying to get EAB to work with another CA, but using documentation and reverse-engineered code from other clients and documentation from Let's Encrypt. I work for the UT-Austin, and are not allowed to use Let's Encrypt for production systems. We are required to use Sectigo (the official CA for UT) for production.
Since I have a lot of success utilizing REST APIs, Python, and such to request and retrieve certificates, as those only require that you have the appropriate credentials for the REST API calls, and permission behind the scenes to request certs for specific domains. I can submit a CSRs and get certificates, no problem.
Since ACME has a little more granular control over domains and such within the management tool for our CA, all that I can manage (without needing to get our ISO involved) I I thought I would try my hand at ACME. It has proven to be quite a challenge!
I am making progress, but stuck on how to implement a External Account Binding. Lots of clients/tools out there, but not many of them support EAB. I have my CA's EAB provided HMAC, KeyID, URL and such. I have successfully obtained a Nonce, and fetched the ACME directories.
In RFC8555; section 7.3.4. External Account Binding.. It has the following structure:
{
"protected": base64url({
"alg": "ES256",
"jwk": /* account key */,
"nonce": "K60BWPrMQG9SDxBDS_xtSw",
"url": "https://example.com/acme/new-account"
}),
"payload": base64url({
"contact": [
"mailto:cert-admin@example.org",
"mailto:admin@example.org"
],
"termsOfServiceAgreed": true,
"externalAccountBinding": {
"protected": base64url({
"alg": "HS256",
"kid": /* key identifier from CA */,
"url": "https://example.com/acme/new-account"
}),
"payload": base64url(/* same as in "jwk" above */),
"signature": /* MAC using MAC key from CA */
}
}),
"signature": "5TWiqIYQfIDfALQv...x9C2mg8JGPxl5bI4"
}
This is where major confusion sets in, as there are multiple references to "signature", "jwk", "MAC", and "kid". I have yet to find any concrete documentation either from our CA or other clients (reviewing code) or documentation from other CAs.
In the example above, does anyone have idea what those values need to be for EAB? Has anyone attempted to create and submit EAB to a CA? What was the structure you used? ..and sheepishly ask .. maybe have any experience with Sectigo EAB and ACME?
I have code for generating private/pub keys, and encrypting the JWK header, the comment about "same as in 'jwk' above" -- what does that mean? JWK when encrypted are SHA256 hashed base64 encoded json structures.. got that. So is that called an account key? So much terminology so little explanations.