Skip to content

Implement RFC 8555 async order finalization to fix read timeout issue with some ACME clients#2636

Open
netops2devops wants to merge 2 commits intosmallstep:masterfrom
esnet:fix/issue-2056/async-order-finalize
Open

Implement RFC 8555 async order finalization to fix read timeout issue with some ACME clients#2636
netops2devops wants to merge 2 commits intosmallstep:masterfrom
esnet:fix/issue-2056/async-order-finalize

Conversation

@netops2devops
Copy link
Copy Markdown

@netops2devops netops2devops commented Apr 3, 2026

Name of feature:

Pain or issue this feature alleviates:

RFC 8555 Section 7.4 explicitly defines "processing" as a distinct order state to decouple the finalize request (submit CSR) from certificate issuance (CA signing). This async handoff lets ACME servers back slow CAs without blocking the client. Current ACME implementation in step-ca skips this state which causes issues when an external CA sometimes takes a long time to return a signed certificate.

With this change, FinalizeOrder now immediately returns status=processing with Retry-After instead of blocking until the external CA responds. This prevents certbot's 45s & cert-manager's 60s default read timeout from firing when certificate signing takes longer. Certbot's poll_finalization loop handles the processing state natively.

Why is this important to the project (if not answered above):

Is there documentation on how to use this feature? If so, where?

This isn't a new feature. It fixes an existing issue #2056

In what environments or workflows is this feature supported?

In what environments or workflows is this feature explicitly NOT supported (if any)?

Supporting links/other PRs/issues:

#2056

💔Thank you!

with ACME clients

  FinalizeOrder now immediately returns status=processing with Retry-After
  instead of blocking until the external CA responds. This prevents certbot's
  hardcoded 45s & cert-manager's 60s read timeout from firing when certificate signing takes longer.

  Certbot's poll_finalization loop handles the processing state natively.
  Tracked upstream: smallstep#2056
@CLAassistant
Copy link
Copy Markdown

CLAassistant commented Apr 3, 2026

CLA assistant check
All committers have signed the CLA.

@CLAassistant
Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

  orphans a processing order, acme client polls will eventually get invalid once ExpiresAt passes — at which point acme client can start a fresh order.
netops2devops added a commit to esnet/certificates that referenced this pull request Apr 3, 2026
RFC 8555 Section 7.4 explicitly defines "processing" as a distinct order state to decouple the finalize request (submit CSR) from certificate issuance (CA signing). This async handoff lets ACME servers back slow CAs without blocking the client. Current ACME implementation in step-ca skips this state which causes issues when an external CA sometimes takes a long time to return a signed certificate.

With this change, FinalizeOrder now immediately returns status=processing with Retry-After instead of blocking until the external CA responds. This prevents certbot's 45s & cert-manager's 60s default read timeout from firing when certificate signing takes longer. Certbot's poll_finalization loop handles the processing state natively.

 esnet/acme-proxy#22
 smallstep#2636
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs triage Waiting for discussion / prioritization by team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants