Kurzes Update:
ACMEv2 ist in Froxlor 0.9.40.1-1 schon passend eingerichtet und funktioniert auch. ABER: Wenn man vorher ACMEv1 verwendet hat, sind in der Datenbank Felder gesetzt, die das Skript scheitern lassen.
Folgendermaßen konnte ich das Problem für mich erstmal lösen:
In der Datenbank die Tabelle panel_customers suchen. Dort sollte es die Spalten "lepublickey" "leprivatekey" "leregistered" und "leaccount" geben. Für ACMEv2 wird in "leaccount" eine Account-ID (Key-ID) erwartet, die letztlich wie eine URL aussieht. Wenn man ACMEv1 benutzt hat, wird dieses Feld jedoch leer sein. Dafür sind die Felder für den privaten und öffentlichen Schlüssel ("lepublickey" und "leprivatekey") gefüllt und zudem der Wert von "leregistered" auf 1 gesetzt.
Was nun passiert (in meinen Worten) ist, dass Froxlor durch den "leregistered=1" denkt, dass es längst einen Account für den User bei LetsEncrypt gibt und für ein Refresh muss die Account-ID (Key-ID) mitgeschickt werden. Diese ist jedoch leer und daher gibt es die Rückmeldung
{"type":"urn:ietf:params:acme:error:malformed","detail":"No Key ID in JWS header","status":400}
Dies kann man aus meiner Sicht so umgehen:
Setzen von "leregistered=0"
Setzen von "lepublickey" UND "leprivatekey" auf NULL
Somit sieht der User für Froxlor "jungfräulich" aus und das Script startet mit dem Erstellen eines neuen Account-Keys, bevor es dann dafür das Zertifkat versucht erstellen zu lassen.
Ich werde erst gegen Ende Mai bei der nächsten Domain, die dann fällig ist, sehe ob das wirklich Abhilfe schafft, aber ich bin zuversichtlich und kann das ganze erstmal so weiter betreiben (wohl wissend, dass ich demnächst mal den Server upgraden muss).
Wenn es dem einen oder anderen hilft, sehr gut. Ansonsten habe ich es für meine Akten hier notiert
Viele Grüße