All authorizations seems to have passed, but the finalize request still fail with a processing status instead of issuing the certificate or an invalid state.
If I retry the processes, I get a 403 forbidden...
Why do you think that "processing" is a failure? Processing means that it's in progress, and you need to poll the order until it becomes "valid" or "invalid". Look at the flowcharts in RFC 8555 section 7.1.6.
The order moves to the "processing" state after the client submits a request to the order's "finalize" URL and the CA begins the issuance process for the certificate. Once the certificate is issued, the order enters the "valid" state. If an error occurs at any of these stages, the order moves to the "invalid" state.
You may want to look at this announcement. They don't have asynchronous finalization in prod, but they may still have it on in staging:
Motivation was comming from the requirement of my vpn with a letsencrypt certificate for ease of use to circuvent the fucking age verification laws and censorship in france...
Again, I don't know why you say it "fails", you're getting a 200 OK and the "processing" means that it's working as expected.
Look at page 48 of RFC 8555, which lists what you should do depending on the status.
The order URI. It's in the "Location" header of the finalize request, and I think you would have received in response to the new order request as well. Make sure you're using a POST-as-GET request for it.
Getting a 200 OK response with a processing response is confusing.
It may have been smarter to send a 100 Continue, 102 Processing or 103 Early Hints ?
I think the implementation is strange, the client issue the newOrder, get a 200 OK, then check that all authorizations have passed, then has to POST-as-GET on Location header hidden in the newOrder request...
Maybe it's too late to change the behaviour, but it's far from the KISS and stateless webservice logic.
Developping the acme client is hard, because of the processing/ready state that can't be determisticly reproduced.
I'll definitely agree that the ACME protocol seems more convoluted than it needs to be. It's designed to be extensible and work across a lot of different server and client implementations, but there weren't all that many different implementations to start with as they were making it. Things like that posting an empty body and posting a {} body do different things is also a "gotcha" for a lot of implementors. It has all the advantages and disadvantages of being designed by committee.
But, for better or worse, it's the standard. And that text on page 48 says that with a 200 OK response, just what should be done for each of the 5 possible status responses.
Also, I highly recommend testing against more than just Let's Encrypt's systems. Other CAs sometimes do things just slightly differently, and there's Pebble as well which is designed for testing.