Extern geliefertes Zertifikat verwenden, statt es zu kopieren

Liefert eine fremde Stelle das Zertifikat in ein Verzeichnis und
ersetzt es dort beim Erneuern - gleicher Dateiname, neuer Inhalt -,
passt der uebliche Weg nicht: der Proxy Manager kopiert hochgeladene
Zertifikate nach /data/custom_ssl/npm-<id>/ und bekommt von einer
ersetzten Datei nichts mit.

Das Verzeichnis wird deshalb schreibgeschuetzt als /certs in den
Container gehaengt (neuer Mount in der compose-Datei, Vorgabe
./data/npm/external-certs), und "cert external" ersetzt die beiden
Dateien unter custom_ssl durch Verweise darauf. Am Abbild
jc21/nginx-proxy-manager:2 nachgemessen: nginx liefert danach das
externe Zertifikat, und ein Austausch der Datei wirkt - allerdings erst
nach einem Neuladen.

Genau das ist der Haken, und er ist belegt: ohne Neuladen liefert nginx
weiterhin das alte Zertifikat. Dafuer gibt es

  cert external --refresh      vergleicht den SHA256-Fingerabdruck mit
                               dem zuletzt gesehenen und laedt nur bei
                               Aenderung neu
  cert external --watch on     traegt das als taeglichen cron-Eintrag ein

Vor dem Umstellen wird geprueft, ob beide Dateien lesbar sind, ob
Zertifikat und Schluessel zusammengehoeren (Vergleich der oeffentlichen
Schluessel - das faengt auch EC-Schluessel) und wie lange es noch gilt.
Beide Faelle sind durchgespielt: ein fremder Schluessel wird abgelehnt,
ein in fuenf Tagen ablaufendes Zertifikat gemeldet.

"cert external --off --id N" nimmt es zurueck und legt wieder eigene
Kopien an. In der Oberflaeche ist aus dem Menuepunkt "Zertifikat" ein
kleines Menue geworden.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-20 22:05:20 +02:00
co-authored by Claude Opus 5
parent 81ff194bd1
commit 4456f8c3ea
7 changed files with 522 additions and 0 deletions
+72
View File
@@ -557,6 +557,8 @@ Die wichtigsten Schalter:
| `BACKUP_DIR` | Ablage für **manuelle** Backups (Vorgabe `./backups`); geplante Jobs haben eigene Pfade |
| `BACKUP_AUTO` | `on`/`off` – sollen die Backup-Jobs per cron laufen? |
| `CERT_DOMAIN`, `CERT_DAYS` | Vorgaben für selbstsignierte Zertifikate |
| `CERT_EXTERNAL_DIR`, `CERT_EXTERNAL_FULLCHAIN`, `CERT_EXTERNAL_KEY` | Verzeichnis und Dateinamen eines von außen gelieferten Zertifikats |
| `CERT_EXTERNAL_WATCH` | täglich prüfen, ob es ausgetauscht wurde |
| `FW_ROLE` | `single`/`central`/`remote` – Rolle im verteilten Monitoring, steuert die Firewall-Prüfung |
| `FW_EC_SYSLOG`, `FW_EC_SNMPTRAP`, `FW_EC_TCP` | Event Console: Syslog (514), SNMP-Traps (162/udp), Status über TCP (6558) |
| `FW_AGENT` | läuft auf diesem Host ein Checkmk-Agent im Pull-Betrieb? (6556) |
@@ -1747,6 +1749,75 @@ Ziele prüfen**.
> Proxy erreicht, genau wie Checkmk auf 5000. `firewall close` bietet einen
> versehentlich geöffneten Port wieder an.
### 10.13 Ein von außen geliefertes Zertifikat verwenden
Wenn eine fremde Stelle das Zertifikat in ein Verzeichnis legt und es beim
Erneuern dort **ersetzt** – gleicher Dateiname, neuer Inhalt –, passt der
übliche Weg nicht: Der Proxy Manager kopiert hochgeladene Zertifikate nach
`/data/custom_ssl/npm-<id>/` und bekommt von einer ersetzten Datei nichts mit.
Deshalb wird das Verzeichnis **schreibgeschützt als `/certs` in den Container
gehängt**, und die beiden Dateien unter `custom_ssl` werden durch Verweise
darauf ersetzt:
```bash
./scripts/cmk-manage.sh config set CERT_EXTERNAL_DIR /etc/ssl/kunde
./scripts/cmk-manage.sh up # Container neu erstellen, damit er /certs sieht
./scripts/cmk-manage.sh cert external --domain kunde.example.com
```
| Einstellung | Bedeutung |
|---|---|
| `CERT_EXTERNAL_DIR` | Verzeichnis auf dem Host (Vorgabe `./data/npm/external-certs`) |
| `CERT_EXTERNAL_FULLCHAIN` | Dateiname der Zertifikatskette (Vorgabe `fullchain.pem`) |
| `CERT_EXTERNAL_KEY` | Dateiname des privaten Schlüssels (Vorgabe `privkey.pem`) |
| `CERT_EXTERNAL_WATCH` | täglich auf Austausch prüfen (`on`/`off`) |
Vor dem Umstellen wird geprüft, ob beide Dateien lesbar sind, **ob Zertifikat
und Schlüssel zusammengehören** (Vergleich der öffentlichen Schlüssel) und wie
lange es noch gilt:
```
[FEHLER] Zertifikat und Schluessel gehoeren nicht zusammen.
[ WARN ] Das Zertifikat laeuft in weniger als 14 Tagen ab (Sep 25 20:03:58 2026 GMT).
```
**Der Austausch allein genügt nicht.** nginx liest Zertifikatsdateien beim
Start und beim Neuladen – nachgemessen an einem ausgetauschten Zertifikat:
| | ausgeliefert |
|---|---|
| Datei ersetzt, kein Neuladen | **altes** Zertifikat |
| nach `nginx -s reload` | neues Zertifikat |
Dafür gibt es zwei Wege:
```bash
./scripts/cmk-manage.sh cert external --refresh # einmalig, lädt nur bei Änderung neu
sudo ./scripts/cmk-manage.sh cert external --watch on # täglich per cron
```
`--refresh` vergleicht den SHA256-Fingerabdruck mit dem zuletzt gesehenen
(`cert-external.state`) und lädt nginx nur dann neu. Der Wächter schreibt dafür
`/etc/cron.d/checkmk-cert-external`.
Zurück auf eine eigene Kopie – danach lebt der Proxy Manager wieder mit seinen
eigenen Dateien weiter:
```bash
./scripts/cmk-manage.sh cert external --off --id 3
```
`cert external` ohne Angabe zeigt den Stand: Verzeichnis, Ablaufdatum,
Aussteller, ob `/certs` im Container ankommt, welche Zertifikate darauf zeigen
und ob der Wächter eingetragen ist. In der Oberfläche liegt alles unter
**Selbstsigniertes Zertifikat erzeugen → Extern geliefertes Zertifikat
verwenden**.
> Wird das Zertifikat im Proxy Manager über die **Weboberfläche** neu
> hochgeladen, ersetzt er die Verweise wieder durch Kopien. Dann einmal
> `cert external --domain …` nachziehen.
---
## 11. Proxy Manager lokal einrichten (Terminal-Browser)
@@ -2492,6 +2563,7 @@ Eine Dateiauswahl mit Verzeichnisnavigation ist eingebaut.
| `npm-reset` | Datenbank beiseitelegen, damit das Konto neu entsteht |
| `proxy status\|list\|certs\|add\|del` | Proxy-Hosts über die API anlegen und verwalten |
| `cert …` | selbstsigniertes Zertifikat erzeugen |
| `cert external …` | von außen geliefertes Zertifikat verwenden (verweisen statt kopieren) |
| `firewall [check\|open\|close]` | prüfen, öffnen und nicht mehr Benötigtes wieder schließen (firewalld, ufw, nftables, iptables); `close --keep-admin` lässt den Adminport offen |
| `shell` | Root-Shell im Checkmk-Container |
| `omd …` | beliebiges `omd`-Kommando im Container |