Skip to content

Commit a0ad743

Browse files
committed
release: improve Linux defaults and harden renewal workflow
certbro-public-snapshot: true certbro-private-commit: ad4d3a36837bfe3f27b79a11c65f433a6db0020c certbro-private-branch: main
1 parent d0a7d0e commit a0ad743

23 files changed

Lines changed: 534 additions & 49 deletions

CHANGES.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Changes
2+
3+
This file summarizes notable changes from the most recent committed updates.
4+
5+
## 2026-03-22
6+
7+
- Added English and German validity-management guides and updated the existing renewal, issuing, quick-start, and Ubuntu example docs to describe the new lifetime rules and short-lifetime examples correctly.
8+
- Expanded regression coverage for schedule transitions, renewal timing validation, legacy lead-time normalization, and recent-issuance cooldown behavior.
9+
- Added a 48-hour cooldown after fresh issuance. Non-forced renewal runs now skip certificates that were issued less than 48 hours ago.
10+
- Added self-healing for legacy managed certificates with overly large lead times. During renewals, stored lead times are reduced to `validity_days - 1` when needed.
11+
- Added renewal timing validation to prevent immediate renewal or reissue loops. New and updated configurations now require `validity_days` to be greater than both `renew_before_days` and `reissue_lead_days`.
12+
- Added automatic normalization of stored `validity_days` during renewals. If an older managed certificate still stores a now-too-large value, `certbro renew` uses the current schedule-aware default and persists the adjusted value after a successful run.
13+
- Moved the schedule-aware CA/B validity handling one day earlier than the official transition dates, so `certbro` starts using the upcoming lower defaults on `2026-03-14`, `2027-03-14`, and `2029-03-14`.
14+
15+
---
16+
17+
- The Linux install check now passes an explicit certificates root to `certbro install`, keeping the smoke run self-contained and repeatable.
18+
- The smoke test now uses temporary values for `CERTBRO_CERTIFICATES_DIR` and `CERTBRO_RENEW_LOCK_FILE`, so it no longer touches `/etc/certbro`.
19+
- Hardened `scripts/test-smoke.sh` for the Linux default paths introduced in the previous commit.
20+
21+
---
22+
23+
- Cleaned up repository maintenance scripts and ignored local helper script copies in `.gitignore`.
24+
- Updated the English and German README/getting-started guides to document the Linux defaults and the system-wide deployment layout.
25+
- Added regression tests for the Linux default paths and for preserving verified API settings during renew discovery.
26+
- Fixed `renew` discovery so runs with a certificates directory preserve verified global API configuration, including `api_key_validated_at`.
27+
- Updated the CLI root defaults so `--state-file` and `--certificates-dir` follow those Linux system paths by default.
28+
- Switched the default Linux paths to `/etc/certbro/state.json` for the global state file and `/etc/certbro` for managed certificate directories.

README.de.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@ sudo certbro --state-file /etc/certbro/state.json install \
8383
- Paralleler RSA- und ECDSA-Betrieb: `certbro issue-pair`
8484
- Bereits bestehende regfish-Bestellungen: Import per `certificate_id`
8585
- Sofortiger Ersatz: `certbro renew --name example-com --force`
86-
- Einmaliger Laufzeit-Override: `certbro renew --name example-com --force --validity-days 3`
86+
- Einmaliger Laufzeit-Override: `certbro renew --name example-com --force --validity-days 30`
8787
- Pending-Ausstellung nach Timeout: `certbro renew --name example-com` erneut ausführen, um denselben Request weiter zu beobachten
88-
- Wenn `--validity-days` fehlt, verwendet `certbro` einen datumsabhängigen Default gemäß CA/B-Forum-Zeitplan: `199` Tage ab 2026-03-15, `99` Tage ab 2027-03-15 und `46` Tage ab 2029-03-15
88+
- Wenn `--validity-days` fehlt, verwendet `certbro` einen datumsabhängigen Default mit einem Sicherheitspuffer von einem Tag vor jedem CA/B-Forum-Stichtag: `199` Tage ab 2026-03-14, `99` Tage ab 2027-03-14 und `46` Tage ab 2029-03-14
8989
- Ruhige Ausgabe für Automatisierung: `--quiet` bei `issue` oder `renew`
9090

9191
## Dokumentation

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@ sudo certbro --state-file /etc/certbro/state.json install \
8383
- Dual RSA and ECDSA deployment: use `certbro issue-pair`
8484
- Existing regfish orders: import by `certificate_id`
8585
- Immediate replacement: `certbro renew --name example-com --force`
86-
- One-off renewal lifetime override: `certbro renew --name example-com --force --validity-days 3`
86+
- One-off renewal lifetime override: `certbro renew --name example-com --force --validity-days 30`
8787
- Pending issuance after a timeout: rerun `certbro renew --name example-com` to resume monitoring the existing request
88-
- If `--validity-days` is omitted, `certbro` uses a date-aware default aligned with the CA/B Forum validity schedule: `199` days from 2026-03-15, `99` days from 2027-03-15, and `46` days from 2029-03-15
88+
- If `--validity-days` is omitted, `certbro` uses a date-aware default with a one-day safety margin before each CA/B Forum transition: `199` days from 2026-03-14, `99` days from 2027-03-14, and `46` days from 2029-03-14
8989
- Quiet output for automation: add `--quiet` to `issue` or `renew`
9090

9191
## Documentation

docs/de/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Dieses Verzeichnis enthält die deutschsprachigen Betriebs- und Nutzungshinweise
1212
## Zertifikats-Workflows
1313

1414
- [Zertifikate bestellen](issuing-certificates.md): Single-Domain, SANs, Produktauswahl, Key-Algorithmen, Laufzeitplan und leise Ausgabe
15+
- [Laufzeitverwaltung](validity-management.md): gespeicherte Laufzeiten manuell ändern und automatisch an künftige Limits anpassen
1516
- [Parallele RSA- und ECDSA-Zertifikate](dual-certificates.md): gleichzeitiger Betrieb für moderne und ältere TLS-Clients
1617
- [Renewals und Ersatz](renewals-and-replacement.md): reguläre Renewals, erzwungene Renewals, Laufzeit-Overrides, künftige CA/B-Forum-Limits und schneller Ersatz
1718
- [Bestehende Zertifikate importieren](import-existing-certificates.md): Zertifikate aus der regfish UI unter `certbro`-Verwaltung übernehmen

docs/de/examples/ubuntu-apache-certbro.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ export HOST_FQDN='example.certbro.com'
3535
export CERTBRO_NAME='example-certbro-com'
3636
export CERTBRO_PRODUCT='RapidSSL'
3737
export CERTBRO_VALIDITY_DAYS='3'
38+
export CERTBRO_RENEW_BEFORE_DAYS='2'
39+
export CERTBRO_REISSUE_LEAD_DAYS='2'
3840
export WEBROOT="/var/www/${HOST_FQDN}/html"
3941
export CERTBRO_DIR="/etc/certbro/${HOST_FQDN}"
4042
export CERTBRO_STATE_FILE='/etc/certbro/state.json'
@@ -222,6 +224,8 @@ sudo certbro --state-file "${CERTBRO_STATE_FILE}" issue \
222224
--common-name "${HOST_FQDN}" \
223225
--product "${CERTBRO_PRODUCT}" \
224226
--validity-days "${CERTBRO_VALIDITY_DAYS}" \
227+
--renew-before-days "${CERTBRO_RENEW_BEFORE_DAYS}" \
228+
--reissue-lead-days "${CERTBRO_REISSUE_LEAD_DAYS}" \
225229
--webserver apache \
226230
--output-dir "${CERTBRO_DIR}"
227231
```
@@ -321,6 +325,8 @@ sudo certbro --state-file "${CERTBRO_STATE_FILE}" renew \
321325
--validity-days "${CERTBRO_VALIDITY_DAYS}"
322326
```
323327

328+
Das `3`-Tage-Beispiel funktioniert nur, weil die gespeicherten Lead-Tage auf `2` gesetzt wurden. `certbro` lehnt Laufzeiten ab, die nicht größer sind als die Renewal-Lead-Tage.
329+
324330
`--force` nur verwenden, wenn bewusst ein echter Renewal- oder Reissue-Flow für Tests ausgelöst werden soll.
325331

326332
Service-Logs prüfen:

docs/de/examples/ubuntu-nginx-certbro.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ export HOST_FQDN='example.certbro.com'
3434
export CERTBRO_NAME='example-certbro-com'
3535
export CERTBRO_PRODUCT='RapidSSL'
3636
export CERTBRO_VALIDITY_DAYS='3'
37+
export CERTBRO_RENEW_BEFORE_DAYS='2'
38+
export CERTBRO_REISSUE_LEAD_DAYS='2'
3739
export WEBROOT="/var/www/${HOST_FQDN}/html"
3840
export CERTBRO_DIR="/etc/certbro/${HOST_FQDN}"
3941
export CERTBRO_STATE_FILE='/etc/certbro/state.json'
@@ -230,6 +232,8 @@ sudo certbro --state-file "${CERTBRO_STATE_FILE}" issue \
230232
--common-name "${HOST_FQDN}" \
231233
--product "${CERTBRO_PRODUCT}" \
232234
--validity-days "${CERTBRO_VALIDITY_DAYS}" \
235+
--renew-before-days "${CERTBRO_RENEW_BEFORE_DAYS}" \
236+
--reissue-lead-days "${CERTBRO_REISSUE_LEAD_DAYS}" \
233237
--webserver nginx \
234238
--webserver-config /etc/nginx/nginx.conf \
235239
--key-type ecdsa \
@@ -338,6 +342,8 @@ sudo certbro --state-file "${CERTBRO_STATE_FILE}" renew \
338342
--validity-days "${CERTBRO_VALIDITY_DAYS}"
339343
```
340344

345+
Das `3`-Tage-Beispiel funktioniert nur, weil die gespeicherten Lead-Tage auf `2` gesetzt wurden. `certbro` lehnt Laufzeiten ab, die nicht größer sind als die Renewal-Lead-Tage.
346+
341347
`--force` nur verwenden, wenn bewusst ein echter Renewal- oder Reissue-Flow für Tests ausgelöst werden soll.
342348

343349
Service-Logs prüfen:

docs/de/getting-started.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ sudo certbro --state-file /etc/certbro/state.json issue \
5151
--output-dir /etc/certbro/example.com
5252
```
5353

54-
Wenn `--validity-days` nicht gesetzt ist, wählt `certbro` automatisch einen datumsabhängigen Default gemäß CA/B-Forum-Zeitplan. Die aktuellen Defaults sind `199` Tage ab `2026-03-15`, `99` Tage ab `2027-03-15` und `46` Tage ab `2029-03-15`.
54+
Wenn `--validity-days` nicht gesetzt ist, wählt `certbro` automatisch einen datumsabhängigen Default mit einem Sicherheitspuffer von einem Tag vor jedem CA/B-Forum-Stichtag. Die aktuellen Defaults sind `199` Tage ab `2026-03-14`, `99` Tage ab `2027-03-14` und `46` Tage ab `2029-03-14`.
5555

5656
Nach erfolgreicher Bestellung schreibt `certbro` unter anderem:
5757

docs/de/issuing-certificates.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,17 @@ Wenn `--validity-days` nicht gesetzt ist, nutzt `certbro` einen datumsabhängige
1818

1919
## Laufzeit-Zeitplan
2020

21-
`certbro` folgt dem CA/B-Forum-Zeitplan für öffentlich vertrauenswürdige TLS-Zertifikate.
21+
`certbro` folgt dem CA/B-Forum-Zeitplan für öffentlich vertrauenswürdige TLS-Zertifikate und beginnt aus Sicherheitsgründen jeweils einen Tag früher mit dem niedrigeren Default.
2222

23-
- Vor `2026-03-15` ausgestellte Zertifikate: maximal `398` Tage, Default `397`
24-
- Ab `2026-03-15` und vor `2027-03-15`: maximal `200` Tage, Default `199`
25-
- Ab `2027-03-15` und vor `2029-03-15`: maximal `100` Tage, Default `99`
26-
- Ab `2029-03-15`: maximal `47` Tage, Default `46`
23+
- Vor `2026-03-14` ausgestellte Zertifikate: maximal `398` Tage, Default `397`
24+
- Ab `2026-03-14` und vor `2027-03-14`: maximal `200` Tage, Default `199`
25+
- Ab `2027-03-14` und vor `2029-03-14`: maximal `100` Tage, Default `99`
26+
- Ab `2029-03-14`: maximal `47` Tage, Default `46`
2727

2828
Wenn `--validity-days` gesetzt wird, validiert `certbro` den Wert vor der Bestellung gegen das aktuell gültige Limit.
2929

30+
Die gewünschte Laufzeit muss außerdem größer sein als `--renew-before-days` und `--reissue-lead-days`. So verhindert `certbro`, dass direkt nach der Ausstellung sofort wieder ein Renewal oder Reissue fällig wird.
31+
3032
## Subject Alternative Names
3133

3234
`--dns-name` für jede SAN wiederholen:

docs/de/renewals-and-replacement.md

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ sudo certbro --state-file /etc/certbro/state.json --certificates-dir /etc/certbr
2424

2525
Wenn eine Bestellung beim Erreichen des Wait-Timeouts noch `pending` ist, kann später einfach `certbro renew` erneut ausgeführt werden. `certbro` beobachtet dann denselben offenen Request weiter und startet keine doppelte Bestellung.
2626

27+
Damit frisch ausgestellte Zertifikate nicht sofort wieder in den Renewal-Flow geraten, überspringt `certbro` außerdem Zertifikate, die jünger als `48` Stunden sind, solange `--force` nicht gesetzt ist.
28+
2729
## Renewal vs. Reissue
2830

2931
`certbro` wählt automatisch den passenden regfish-API-Flow:
@@ -53,11 +55,13 @@ Wenn für einen erzwungenen Renewal-Lauf oder eine neue Renewal-Order eine ander
5355
sudo certbro --state-file /etc/certbro/state.json renew \
5456
--name example-com \
5557
--force \
56-
--validity-days 3
58+
--validity-days 30
5759
```
5860

5961
`--validity-days` gilt in diesem Lauf für Renewal-Orders und neue Orders. Für Reissues gilt der Wert nicht.
6062

63+
Die gewünschte Laufzeit muss dabei größer bleiben als die gespeicherten Werte für `renew_before_days` und `reissue_lead_days`. Für sehr kurz laufende Zertifikate sollten diese Lead-Tage zuerst abgesenkt werden.
64+
6165
Den gespeicherten Default für künftige Renewal-Orders ändern:
6266

6367
```sh
@@ -66,16 +70,23 @@ sudo certbro --state-file /etc/certbro/state.json update \
6670
--validity-days 90
6771
```
6872

69-
Wenn gespeicherte `validity_days` später über dem aktiven CA/B-Forum-Limit liegen, bricht `certbro` vor der Bestellung sauber ab, damit die Laufzeit explizit angepasst werden kann.
73+
Wenn gespeicherte `validity_days` später über dem aktiven schedule-aware Limit liegen, verwendet `certbro renew` automatisch den aktuellen schedule-aware Default und speichert den angepassten Wert nach erfolgreichem Renewal dauerhaft zurück.
7074

71-
Die aktiven CA/B-Forum-Limits sind:
75+
Offizielle CA/B-Forum-Limits:
7276

7377
- vor `2026-03-15`: maximal `398` Tage
7478
- ab `2026-03-15`: maximal `200` Tage
7579
- ab `2027-03-15`: maximal `100` Tage
7680
- ab `2029-03-15`: maximal `47` Tage
7781

78-
Die dazugehörigen schedule-aware Defaults in `certbro` sind `397`, `199`, `99` und `46` Tage.
82+
`certbro` beginnt aus Sicherheitsgründen jeweils einen Tag früher mit dem niedrigeren Default. Die dazugehörigen schedule-aware Defaults sind:
83+
84+
- vor `2026-03-14`: `397` Tage
85+
- ab `2026-03-14`: `199` Tage
86+
- ab `2027-03-14`: `99` Tage
87+
- ab `2029-03-14`: `46` Tage
88+
89+
Für konkrete Beispiele siehe [Laufzeitverwaltung](validity-management.md).
7990

8091
## Aktives Zertifikat schnell ersetzen
8192

@@ -92,7 +103,7 @@ Beispiel:
92103
sudo certbro --state-file /etc/certbro/state.json renew \
93104
--name example-com \
94105
--force \
95-
--validity-days 3
106+
--validity-days 30
96107
```
97108

98109
`certbro` hat aktuell noch keinen eigenen `revoke`-Befehl. Das Widerrufen des vorherigen Zertifikats erfolgt daher über die regfish Console oder die TLS API.

docs/de/validity-management.md

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# Laufzeitverwaltung
2+
3+
English version: [../en/validity-management.md](../en/validity-management.md)
4+
5+
## Überblick
6+
7+
`certbro` speichert die gewünschte Laufzeit pro verwaltetem Zertifikat und verwendet sie für künftige Renewal-Orders und neue Orders weiter.
8+
9+
Für `example.com` kann diese gespeicherte Laufzeit jederzeit geändert werden. `certbro` verwendet dann bei späteren Renewals den neuen Wert, solange er innerhalb des aktuell gültigen schedule-aware Limits liegt.
10+
11+
## Gespeicherte Laufzeit manuell ändern
12+
13+
Beispiel: `example.com` wurde ursprünglich mit `3` Tagen bestellt und soll künftig `30` Tage verwenden.
14+
15+
Gespeicherten Wert aktualisieren:
16+
17+
```sh
18+
sudo certbro update --name example-com --validity-days 30
19+
```
20+
21+
Danach das nächste Renewal normal ausführen:
22+
23+
```sh
24+
sudo certbro renew --name example-com
25+
```
26+
27+
Wenn das aktuell deployte Zertifikat sofort mit der neuen gewünschten Laufzeit ersetzt werden soll:
28+
29+
```sh
30+
sudo certbro renew --name example-com --force --validity-days 30
31+
```
32+
33+
Für sehr kurz laufende Zertifikate müssen die Lead-Tage unter der gewünschten Laufzeit bleiben. Beispiel für ein Zertifikat mit `3` Tagen:
34+
35+
```sh
36+
sudo certbro issue \
37+
--name example-com \
38+
--common-name example.com \
39+
--output-dir /etc/certbro/example.com \
40+
--validity-days 3 \
41+
--renew-before-days 2 \
42+
--reissue-lead-days 2
43+
```
44+
45+
## Automatische Laufzeit-Anpassung
46+
47+
`certbro` folgt dem CA/B-Forum-Zeitplan für Zertifikatslaufzeiten, nutzt dabei aber einen Sicherheitspuffer von einem Tag. Das heißt: `certbro` beginnt einen Tag vor dem offiziellen Stichtag mit dem jeweils niedrigeren Limit.
48+
49+
Offizielle maximale CA/B-Forum-Laufzeiten:
50+
51+
- ab `2026-03-15`: `200` Tage
52+
- ab `2027-03-15`: `100` Tage
53+
- ab `2029-03-15`: `47` Tage
54+
55+
Die schedule-aware Defaults in `certbro`:
56+
57+
- ab `2026-03-14`: `199` Tage
58+
- ab `2027-03-14`: `99` Tage
59+
- ab `2029-03-14`: `46` Tage
60+
61+
## Was mit älteren gespeicherten Werten passiert
62+
63+
Wenn ein verwaltetes Zertifikat noch einen inzwischen zu hohen Wert gespeichert hat, passt `certbro renew` ihn vor der Bestellung automatisch an.
64+
65+
Beispiel:
66+
67+
- für `example.com` sind noch `199` Tage gespeichert
68+
- das Renewal läuft am oder nach `2027-03-14`
69+
- `certbro` bestellt automatisch mit `99` Tagen
70+
- nach erfolgreichem Renewal wird auch der gespeicherte `validity_days`-Wert aktualisiert
71+
72+
Diese automatische Anpassung gilt für gespeicherte Werte während der Renewal-Verarbeitung. Explizite CLI-Eingaben bleiben weiterhin strikt:
73+
74+
- `certbro issue --validity-days ...` wird sofort validiert
75+
- `certbro update --validity-days ...` wird sofort validiert
76+
77+
So bleiben bestehende verwaltete Zertifikate auch bei künftigen Schedule-Änderungen lauffähig, während bewusst gesetzte ungültige neue Werte weiterhin sauber abgelehnt werden.

0 commit comments

Comments
 (0)