https://gitlab.synchro.net/main/sbbs/-/commit/ceb2e8178087c8c5d603073e
Modified Files:
exec/letsyncrypt.js exec/load/acmev2.js
Log Message:
letsyncrypt: name the failing domain, stop destroying the certificate
A failed authorization was silently discarded. authorize_order() caught everything poll_authorization() threw but re-raised only the timeout
string, so a domain that failed http-01 validation simply fell out of
the loop. The run carried on to finalize_order(), Let's Encrypt
answered orderNotReady, and the sysop saw
finalize_order returned 403, not 200
with nothing to say which of a dozen names was at fault. Collect the
failures instead, log one line each, and throw naming every identifier
that failed. poll_authorization() now names the identifier and quotes
the server's own explanation through a new challenge_error() helper:
Authorization failed for example.com (http-01): 192.0.2.1: Fetching
http://example.com/.well-known/acme-challenge/...: Timeout during
connect (likely firewall problem)
A timeout still ends the run rather than waiting out every remaining identifier.
The keyset is now built in ssl.cert.new and renamed into place. It was
being created directly over ssl.cert, which had to be deleted first, so anything that went wrong in between (cryptlib declining to write the
keyset, a full disk) destroyed the working certificate and the only
copy of its private key, leaving TLS to fail at the next recycle with
nothing to roll back to. rename() does not replace an existing file on Windows, so the old certificate is moved aside rather than deleted, and
put back if the second rename fails.
at_least_a_third() no longer lets an unreadable ssl.cert escape as an
uncaught exception. It now means "renew", which is the one thing that
can repair the situation; a truncated keyset used to wedge every later
run of the script.
Co-Authored-By: Claude Opus 5 (1M context) <
noreply@anthropic.com>
--- SBBSecho 3.37-Linux
* Origin: Vertrauen - [vert/cvs/bbs].synchro.net (1:103/705)