refactor(cert-manager): einheitlicher Name Zertifikatsmanager
Tessera CI/CD / Lint & Type Check (push) Successful in 58s
Tessera CI/CD / Tests (push) Failing after 2m20s
Tessera CI/CD / Desktop-Pakete bauen (push) Has been skipped
Tessera CI/CD / Build & Publish Images (push) Has been skipped

Seitenleiste/Marktplatz (Seed), Seitentitel, Anleitungen, Kommentare
und unveroeffentlichter CHANGELOG heissen jetzt Zertifikatsmanager.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-10-09 17:34:48 +02:00
parent 76a30458fc
commit 201765afd4
30 changed files with 49 additions and 43 deletions
+7 -6
View File
@@ -19,12 +19,13 @@ Diese Liste beschreibt in einfachen Worten, was sich von Version zu Version an T
- Dateien, Hochladen und Herunterladen: Dateien und ganze Ordner per Ziehen und Ablegen (auch direkt auf einen Ordner) oder über „Hochladen“ hochladen; große Dateien gehen in Stücken hoch. Die Übertragungsleiste am unteren Rand zeigt den Fortschritt jeder Datei, lässt Abbrechen und Wiederholen zu und nennt Fehler in einfachen Worten. Tessera überschreibt nie stillschweigend: Gibt es den Namen schon, wählen Sie „Ersetzen“, „Beide behalten“ oder „Überspringen“. Dateien werden direkt heruntergeladen, Ordner und Mehrfachauswahl als ZIP-Datei.
- Dateien, Teilen: Im Zeilenmenü einer Datei oder eines Ordners finden Sie jetzt „Teilen“. Dort suchen Sie Kolleginnen, Kollegen und Gruppen aus Ihrer Nextcloud und geben die Datei zum „Ansehen“ oder „Bearbeiten“ frei; die Berechtigung ändern Sie später, und eine Freigabe nehmen Sie mit „Entfernen“ wieder zurück. Außerdem erstellen Sie öffentliche Links mit „Ansehen“ oder „Bearbeiten“, bei Ordnern auch mit „Nur hochladen“, und kopieren sie mit „Link kopieren“. Passwort und Ablaufdatum richten sich nach den Regeln der Firmen-Nextcloud: Verlangt sie ein Passwort, fragt Tessera danach und kann auf Wunsch eines erzeugen. Tessera speichert das Passwort nie und zeigt es nur, solange der Dialog offen ist. Zum Schutz der Nextcloud legt Tessera höchstens 10 neue Freigaben innerhalb von 10 Minuten an.
- Dateien, Übersicht der Freigaben: Die Reiter „Von mir geteilt“ und „Mit mir geteilt“ zeigen alle Freigaben auf einen Blick. Sie öffnen Einträge direkt im zugehörigen Ordner, ändern oder entfernen Ihre eigenen Freigaben, verlassen Freigaben anderer und nehmen offene Freigaben an oder lehnen sie ab. Geteilte Einträge sind in der Dateiliste markiert. Freigaben per E-Mail und an andere Server zeigt Tessera nicht an; sie bleiben der Nextcloud vorbehalten.
- Zertifikat-Manager, ein gemeinsamer Arbeitsbereich: Im ersten Reiter „Dateien“ laden Sie mehrere Dateien nacheinander oder auf einmal hoch, auch ZIP-Dateien vom Zertifikatsaussteller, und können PEM-Text einfügen. Jede Datei bleibt in der Liste, zu jeder steht, was Tessera darin erkannt hat; einzelne Dateien nehmen Sie mit ihrem eigenen Knopf wieder heraus. Passwörter geben Sie je Datei ein. Die Liste, Schlüssel und Passwörter bleiben nur in diesem Browserfenster und sind nach dem Neuladen weg; Tessera speichert sie nirgends. Analysieren, Aufteilen, Zusammenführen, Konvertieren und Vorlagen arbeiten alle mit dieser Liste und zeigen nach dem Entfernen einer Datei nichts mehr aus der alten Auswertung an. Beim Aufteilen bleibt ein Schlüssel, der in Ihrer Datei durch ein Passwort geschützt war, geschützt (Sie geben ein Passwort ein; ohne Schutz speichern Sie nur ausdrücklich, mit Hinweis). Auf einmal prüft Tessera höchstens 200 Zertifikate, 50 Schlüssel und 50 Zertifikatsanfragen. Modulversion 1.2.0.
- Zertifikat-Manager, Zusammenführen und Formate: Tessera ordnet Serverzertifikat, Zwischenzertifikate und Wurzel selbst und prüft dabei die echte Unterschrift jedes Zertifikats. „Fullchain“ und „Nur Kette“ gibt es als PEM, .p7b und .p7c, dazu Zertifikat und Schlüssel in einer PEM-Datei und PFX-Dateien mit eigenem Passwort, wahlweise „Kompatibel“ (auch für ältere Windows-Server, Vorgabe) oder „Modern“ (AES-256). Das Wurzelzertifikat kommt nur mit, wenn Sie „Root-Zertifikat mitnehmen“ ankreuzen. Fehlt ein Zwischenzertifikat, meldet Tessera es mit Namen und bietet „Fehlendes Zertifikat holen“ an: Nur wenn Sie darauf klicken, holt Tessera das Zertifikat von der Adresse des Ausstellers, die im Zertifikat selbst steht, prüft, dass es das Zertifikat wirklich ausgestellt hat, und kennzeichnet es als „nachgeladen“. Neu im Reiter „Konvertieren“: jedes erkannte Zertifikat, jeder Schlüssel und jede Anfrage in jedes passende Format, auch Schlüssel mit Passwort. PFX-Dateien mit Passwörtern, die Umlaute oder das Eurozeichen enthalten, lassen sich jetzt in beide Richtungen mit Windows, OpenSSL und Java austauschen.
- Zertifikat-Manager, Vorlagen: Für Nginx, Apache (ab und vor 2.4.8), Windows/IIS, Nginx Proxy Manager, HAProxy und Tomcat erzeugt Tessera mit einem Klick die passenden Dateien samt den Zeilen für die Einrichtung und einer kurzen Anleitung. Dafür braucht es das Zertifikat und den passenden privaten Schlüssel.
- Zertifikatsmanager, ein gemeinsamer Arbeitsbereich: Im ersten Reiter „Dateien“ laden Sie mehrere Dateien nacheinander oder auf einmal hoch, auch ZIP-Dateien vom Zertifikatsaussteller, und können PEM-Text einfügen. Jede Datei bleibt in der Liste, zu jeder steht, was Tessera darin erkannt hat; einzelne Dateien nehmen Sie mit ihrem eigenen Knopf wieder heraus. Passwörter geben Sie je Datei ein. Die Liste, Schlüssel und Passwörter bleiben nur in diesem Browserfenster und sind nach dem Neuladen weg; Tessera speichert sie nirgends. Analysieren, Aufteilen, Zusammenführen, Konvertieren und Vorlagen arbeiten alle mit dieser Liste und zeigen nach dem Entfernen einer Datei nichts mehr aus der alten Auswertung an. Beim Aufteilen bleibt ein Schlüssel, der in Ihrer Datei durch ein Passwort geschützt war, geschützt (Sie geben ein Passwort ein; ohne Schutz speichern Sie nur ausdrücklich, mit Hinweis). Auf einmal prüft Tessera höchstens 200 Zertifikate, 50 Schlüssel und 50 Zertifikatsanfragen. Modulversion 1.2.0.
- Zertifikatsmanager, Zusammenführen und Formate: Tessera ordnet Serverzertifikat, Zwischenzertifikate und Wurzel selbst und prüft dabei die echte Unterschrift jedes Zertifikats. „Fullchain“ und „Nur Kette“ gibt es als PEM, .p7b und .p7c, dazu Zertifikat und Schlüssel in einer PEM-Datei und PFX-Dateien mit eigenem Passwort, wahlweise „Kompatibel“ (auch für ältere Windows-Server, Vorgabe) oder „Modern“ (AES-256). Das Wurzelzertifikat kommt nur mit, wenn Sie „Root-Zertifikat mitnehmen“ ankreuzen. Fehlt ein Zwischenzertifikat, meldet Tessera es mit Namen und bietet „Fehlendes Zertifikat holen“ an: Nur wenn Sie darauf klicken, holt Tessera das Zertifikat von der Adresse des Ausstellers, die im Zertifikat selbst steht, prüft, dass es das Zertifikat wirklich ausgestellt hat, und kennzeichnet es als „nachgeladen“. Neu im Reiter „Konvertieren“: jedes erkannte Zertifikat, jeder Schlüssel und jede Anfrage in jedes passende Format, auch Schlüssel mit Passwort. PFX-Dateien mit Passwörtern, die Umlaute oder das Eurozeichen enthalten, lassen sich jetzt in beide Richtungen mit Windows, OpenSSL und Java austauschen.
- Zertifikatsmanager, Vorlagen: Für Nginx, Apache (ab und vor 2.4.8), Windows/IIS, Nginx Proxy Manager, HAProxy und Tomcat erzeugt Tessera mit einem Klick die passenden Dateien samt den Zeilen für die Einrichtung und einer kurzen Anleitung. Dafür braucht es das Zertifikat und den passenden privaten Schlüssel.
### Geändert
- Zertifikatsmanager: Das Modul heißt jetzt überall „Zertifikatsmanager“ – in der Seitenleiste, im Marktplatz, auf der Seite und in den Anleitungen. Bisher stand in der Seitenleiste „Cert Manager“ und auf der Seite „Zertifikat-Manager“.
- Eigene Module: Tessera hält jetzt bis zu acht eigene Module offen (vorher fünf). Module, die Sie beim Start vorladen lassen, schließt Tessera nie von selbst.
- DKV-Rechnung: Die Modulbeschreibung im Marktplatz weist jetzt darauf hin, dass das Modul die Freigabestufe „Verwalten“ benötigt. Mit „Benutzen“ erscheint es zwar in der Seitenleiste, öffnet aber nur die Seite „Kein Zugriff“. Modulversion 1.1.0.
- Nextcloud-Status: Über der Kachelliste gibt es jetzt ein Suchfeld. Es zeigt nur die Clouds, deren Kundenname den eingegebenen Text enthält; Groß- und Kleinschreibung spielen keine Rolle, die gewählte Sortierung bleibt erhalten. Die Kacheln sind kompakter, der Kundenname und die Adresse der Cloud stehen in voller Länge da, statt abgeschnitten zu werden. Die Knöpfe Benachrichtigen, Prüfen und Bearbeiten sitzen jetzt unten rechts neben „Zuletzt geprüft“.
@@ -32,9 +33,9 @@ Diese Liste beschreibt in einfachen Worten, was sich von Version zu Version an T
### Behoben
- Sicherheit: Der Schutz davor, dass Tessera interne Adressen abruft (Favoriten-Symbole, Logos in Nextcloud-Status und das neue „Fehlendes Zertifikat holen“), erkennt jetzt auch versteckte Schreibweisen interner IPv6-Adressen, zum Beispiel die gemappte Form ::ffff:7f00:1, NAT64 und 6to4. Beim neuen Abruf prüft Tessera die Adresse außerdem noch einmal im Moment des Verbindens. Der Zertifikat-Manager ist zudem gegen präparierte Dateien abgesichert, die ihn verlangsamen oder zum Absturz bringen könnten: ZIP-Dateien, die sich zu riesigen Datenmengen entpacken (sogenannte ZIP-Bomben), Dateien aus tausenden unvollständigen Zertifikatsblöcken und Passwortschutz mit übermäßig vielen Rechenschritten werden abgewiesen oder übersprungen, und Uploads über der Gesamtgrenze bricht Tessera schon beim Empfang ab. Auch IPv6-Adressen in eckigen Klammern (zum Beispiel für öffentliche Server) werden dabei jetzt richtig beurteilt.
- Zertifikat-Manager: Beim Zusammenführen ersetzte eine zweite Datei die erste; jetzt bleiben alle Dateien in der Liste. Zertifikate und Schlüssel mit elliptischen Kurven (EC) wurden bisher nicht erkannt; jetzt funktionieren sie in allen Reitern.
- Desktop-App: Dateien lassen sich jetzt auch in der Desktop-App per Ziehen und Ablegen hochladen, zum Beispiel im Modul Dateien oder im Zertifikat-Manager. Bisher übernahm die App das Ablegen selbst, und auf der Seite kam nichts an (Linux und Windows). Dafür ist die neue Version der Desktop-App nötig.
- Sicherheit: Der Schutz davor, dass Tessera interne Adressen abruft (Favoriten-Symbole, Logos in Nextcloud-Status und das neue „Fehlendes Zertifikat holen“), erkennt jetzt auch versteckte Schreibweisen interner IPv6-Adressen, zum Beispiel die gemappte Form ::ffff:7f00:1, NAT64 und 6to4. Beim neuen Abruf prüft Tessera die Adresse außerdem noch einmal im Moment des Verbindens. Der Zertifikatsmanager ist zudem gegen präparierte Dateien abgesichert, die ihn verlangsamen oder zum Absturz bringen könnten: ZIP-Dateien, die sich zu riesigen Datenmengen entpacken (sogenannte ZIP-Bomben), Dateien aus tausenden unvollständigen Zertifikatsblöcken und Passwortschutz mit übermäßig vielen Rechenschritten werden abgewiesen oder übersprungen, und Uploads über der Gesamtgrenze bricht Tessera schon beim Empfang ab. Auch IPv6-Adressen in eckigen Klammern (zum Beispiel für öffentliche Server) werden dabei jetzt richtig beurteilt.
- Zertifikatsmanager: Beim Zusammenführen ersetzte eine zweite Datei die erste; jetzt bleiben alle Dateien in der Liste. Zertifikate und Schlüssel mit elliptischen Kurven (EC) wurden bisher nicht erkannt; jetzt funktionieren sie in allen Reitern.
- Desktop-App: Dateien lassen sich jetzt auch in der Desktop-App per Ziehen und Ablegen hochladen, zum Beispiel im Modul Dateien oder im Zertifikatsmanager. Bisher übernahm die App das Ablegen selbst, und auf der Seite kam nichts an (Linux und Windows). Dafür ist die neue Version der Desktop-App nötig.
- Nextcloud-Status: Das Formular zum Hinzufügen und Bearbeiten einer Cloud zeigte bei manchen Eingaben englische Meldungen (zum Beispiel bei einer Bildadresse mit http://). Alle Hinweise in diesem Formular erscheinen jetzt auf Deutsch (bei englischer Spracheinstellung auf Englisch).
## 1.10.1 – 2026-10-06
@@ -1,4 +1,4 @@
# Fixtures des Zertifikat-Managers
# Fixtures des Zertifikatsmanagers
Nur Testdaten (quick-261009-ikt). Keine echten Zertifikate, keine echten Schluessel.
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# Test-only PKI for quick 261009-ikt (Zertifikat-Manager).
# Test-only PKI for quick 261009-ikt (Zertifikatsmanager).
# Erzeugt alle Fixtures dieses Ordners mit OpenSSL (>= 3.4: -legacy, -not_before).
# Die Schluessel der CAs liegen nur in einem mktemp-Ordner, den ein trap loescht;
# committet werden nur Schluessel der Server-Zertifikate.
+1 -1
View File
@@ -4,7 +4,7 @@ import { spkiDerOf } from './cert-keys';
import type { CertItem, ChainGap, ChainInfo, CsrItem, KeyItem } from './cert-types';
/**
* Kettenbau des Zertifikat-Managers (quick-261009-ikt, D-18). Reine Funktionen, kein Netz.
* Kettenbau des Zertifikatsmanagers (quick-261009-ikt, D-18). Reine Funktionen, kein Netz.
*
* Aussteller eines Zertifikats C ist jedes andere Zertifikat I der Menge mit
* `C.checkIssued(I) && C.verify(I.publicKey)`: checkIssued vergleicht Namen, Schluesselkennungen
+1 -1
View File
@@ -5,7 +5,7 @@ import { safeBaseName } from './cert-names';
import type { CsrItem, ItemSource } from './cert-types';
/**
* Zertifikatsanfragen (CSR) des Zertifikat-Managers (quick-261009-ikt, D-05, D-16).
* Zertifikatsanfragen (CSR) des Zertifikatsmanagers (quick-261009-ikt, D-05, D-16).
*
* Die CSR-Leser von forge koennen nur RSA. Darum wird der ASN.1-Aufbau selbst gelesen
* (CertificationRequestInfo: Version, Inhaber, oeffentlicher Schluessel, Attribute) und der
+1 -1
View File
@@ -10,7 +10,7 @@ import {
} from './cert-types';
/**
* Private Schluessel des Zertifikat-Managers (quick-261009-ikt, D-05, D-11, D-16).
* Private Schluessel des Zertifikatsmanagers (quick-261009-ikt, D-05, D-11, D-16).
*
* Alles laeuft ueber node:crypto (`createPrivateKey`): PKCS#1, PKCS#8 und SEC1, als PEM und als DER,
* unverschluesselt, als verschluesseltes PKCS#8 und klassisch verschluesselt (Proc-Type), fuer RSA,
@@ -1,7 +1,7 @@
import type { ModuleChangelog } from '../module-registry/module-changelog';
/**
* Änderungen am Modul Cert Manager, neueste Version zuerst (quick-261008-w5w).
* Änderungen am Modul Zertifikatsmanager, neueste Version zuerst (quick-261008-w5w).
* Die Version in der Seed-Datei kommt ausschließlich von hier; Regeln siehe
* docs/anleitung-entwicklung.md, Abschnitt „Modulversion und Modul-Changelog pflegen“.
*/
@@ -35,6 +35,11 @@ export const CERT_MANAGER_CHANGELOG: ModuleChangelog = [
de: 'Fehlt ein Zwischenzertifikat, holt „Fehlendes Zertifikat holen“ es auf Knopfdruck beim Aussteller.',
en: 'If an intermediate certificate is missing, “Fetch missing certificate” gets it from the issuer at the click of a button.',
},
{
kind: 'changed',
de: 'Das Modul heißt jetzt einheitlich „Zertifikatsmanager“ (vorher „Cert Manager“ in der Seitenleiste).',
en: 'The module now has one consistent name everywhere (previously “Cert Manager” in the sidebar).',
},
{
kind: 'fixed',
de: 'Beim Zusammenführen ersetzt eine zweite Datei nicht mehr die erste.',
@@ -68,7 +68,7 @@ export function repairFileName(name: string): string {
}
/**
* CertManagerController: Zertifikat-Manager (quick-261009-ikt, D-14).
* CertManagerController: Zertifikatsmanager (quick-261009-ikt, D-14).
*
* Zustandslos: nichts wird gespeichert, Passwoerter und Schluessel kommen nie in ein Log
* (kein Logger-Aufruf mit Anfrageinhalt; das Request-Log kennt nur Pfad und Status).
@@ -16,7 +16,7 @@ export async function seedCertManagerModule(
): Promise<void> {
await moduleRegistryService.seedModule({
slug: 'cert-manager',
name: 'Cert Manager',
name: 'Zertifikatsmanager',
// Die Version kommt ausschließlich aus dem Changelog (quick-261008-w5w).
version: latestVersion(CERT_MANAGER_CHANGELOG),
category: 'security-tools',
+1 -1
View File
@@ -29,7 +29,7 @@ import { expandZip, isZip } from './zip-expand';
export { describeKey, keyIdOf, sha256Hex };
/**
* Der eine Parser des Zertifikat-Managers (quick-261009-ikt, D-08, D-16).
* Der eine Parser des Zertifikatsmanagers (quick-261009-ikt, D-08, D-16).
*
* Alles ueber Zertifikate und Schluessel entscheidet node:crypto (RSA und EC, PEM und DER).
* node-forge wird nur fuer PKCS#12 und als allgemeiner ASN.1-Leser/-Schreiber genutzt; die
+1 -1
View File
@@ -1,5 +1,5 @@
/**
* Dateinamen-Helfer des Zertifikat-Managers. Eigene Datei, damit cert-model.ts und cert-output.ts
* Dateinamen-Helfer des Zertifikatsmanagers. Eigene Datei, damit cert-model.ts und cert-output.ts
* einander nicht gegenseitig einbinden muessen.
*/
+1 -1
View File
@@ -18,7 +18,7 @@ import {
} from './cert-types';
/**
* Ausgabe-Bausteine des Zertifikat-Managers (quick-261009-ikt, D-19).
* Ausgabe-Bausteine des Zertifikatsmanagers (quick-261009-ikt, D-19).
* Jeder Inhalt in jedem Format laeuft durch die eine Funktion buildOutput. Die Reihenfolge baut die API
* immer selbst aus den gesendeten Zertifikaten (buildChains); eine vom Browser mitgeschickte Reihenfolge
* wird nie uebernommen. Schluessel und Passwoerter werden nur verarbeitet, nie gespeichert oder
+1 -1
View File
@@ -4,7 +4,7 @@ import { KdfTooExpensiveError, RequestBudget } from './cert-budget';
import { MAX_PASSWORDS } from './cert-keys';
/**
* PKCS#12 (.pfx/.p12) des Zertifikat-Managers (quick-261009-ikt, D-20).
* PKCS#12 (.pfx/.p12) des Zertifikatsmanagers (quick-261009-ikt, D-20).
*
* Lesen laeuft ueber forge (`pkcs12FromAsn1`): OpenSSL-3-Standard (AES-256, SHA-256), das
* kompatible 3DES-Format und das alte RC2-Format werden gelesen. forge kennt aber nur RSA:
+1 -1
View File
@@ -1,7 +1,7 @@
import { HttpException } from '@nestjs/common';
/**
* Vertrag des Zertifikat-Managers (quick-261009-ikt, D-15, D-19, D-24).
* Vertrag des Zertifikatsmanagers (quick-261009-ikt, D-15, D-19, D-24).
* Die Typen werden 1:1 in apps/web/.../cert-manager/actions.ts gespiegelt.
* Alles hier ist zustandslos: Tessera speichert weder Dateien noch Schluessel noch Passwoerter.
*/
+1 -1
View File
@@ -4,7 +4,7 @@ import { cleanSourcePath } from './cert-names';
import type { IgnoredEntry } from './cert-types';
/**
* ZIP-Erkennung und -Entpacken des Zertifikat-Managers (quick-261009-ikt, D-17).
* ZIP-Erkennung und -Entpacken des Zertifikatsmanagers (quick-261009-ikt, D-17).
*
* Regeln:
* - Ein ZIP erkennt man an den Anfangsbytes (PK\x03\x04 oder PK\x05\x06), nie an der Endung.
+2 -2
View File
@@ -14,7 +14,7 @@ export type HttpApp = Pick<INestApplication, 'use' | 'useGlobalPipes' | 'enableC
* Gemeinsame HTTP-Einrichtung der API (aus main.ts, damit die Reihenfolge testbar ist).
*
* Reihenfolge der Schichten bei Express: Anfragelog, Cookies, CORS, dann der eigene JSON-Leser
* fuer POST build des Zertifikat-Managers. Der Leser muss HINTER enableCors stehen (Review WR-01):
* fuer POST build des Zertifikatsmanagers. Der Leser muss HINTER enableCors stehen (Review WR-01):
* seine Fehlerantworten 413 und 400 entstehen, bevor Nests Schichten laufen, und ohne vorherige
* CORS-Schicht blockiert der Browser sie im Entwicklungsaufbau mit getrennten Ursprungsadressen
* (die Oberflaeche sieht dann nur einen Netzwerkfehler statt tooLarge / invalidInput).
@@ -41,7 +41,7 @@ export function configureHttp(app: HttpApp, corsOrigin: string): void {
credentials: true,
});
// Eigene JSON-Grenze (512 KiB) nur fuer POST build des Zertifikat-Managers, nach CORS und vor
// Eigene JSON-Grenze (512 KiB) nur fuer POST build des Zertifikatsmanagers, nach CORS und vor
// Nests globalem Leser (quick-261009-ikt D-26, WR-01)
app.use(CERT_BUILD_ROUTE, certBuildJsonBody, certBuildBodyErrors);
}
+1 -1
View File
@@ -1148,7 +1148,7 @@ pub fn run() {
// kein `drop` -- Nutzer, 09.10.2026: Hochladen per Ziehen im
// Modul Dateien ging im Linux-Client nicht. Die App braucht das
// eigene Ereignis nicht, also bekommt die Webseite das Ablegen
// wie im Browser (Dateien, Zertifikat-Manager, alle Ablagefelder).
// wie im Browser (Dateien, Zertifikatsmanager, alle Ablagefelder).
.disable_drag_drop_handler()
// Neue Fenster (Suche-Widget per `window.open`, „In neuem Tab
// öffnen“ bei XFrame/eigenen Modulen/Favoriten) verwarf die
@@ -1,7 +1,7 @@
import { toFormData, type WorkingEntry } from './working-set';
/**
* Aufrufe der Zertifikat-Manager-API (quick-261009-ikt). Die Typen spiegeln 1:1
* Aufrufe der Zertifikatsmanager-API (quick-261009-ikt). Die Typen spiegeln 1:1
* apps/api/src/cert-manager/cert-types.ts.
*
* Passwoerter und Schluessel stehen nur im Koerper der Anfrage, nie in einer Adresse
@@ -45,7 +45,7 @@ afterEach(cleanup);
describe('CertManagerPage', () => {
it('zeigt Titel und die Reiter in der Reihenfolge Dateien, Analysieren, Aufteilen, Zusammenführen, Konvertieren, Vorlagen', () => {
render(<CertManagerPage />);
expect(screen.getByRole('heading', { name: 'Zertifikat-Manager' })).toBeInTheDocument();
expect(screen.getByRole('heading', { name: 'Zertifikatsmanager' })).toBeInTheDocument();
const nav = screen.getByRole('navigation');
const tabs = within(nav).getAllByRole('button');
expect(tabs.map((b) => b.textContent)).toEqual([
@@ -16,7 +16,7 @@ import { useCertWorkspace } from './use-cert-workspace';
type TabId = 'files' | 'analyze' | 'split' | 'merge' | 'convert' | 'templates';
/**
* CertManagerPage: Zertifikat-Manager rund um einen gemeinsamen Arbeitsbereich (quick-261009-ikt).
* CertManagerPage: Zertifikatsmanager rund um einen gemeinsamen Arbeitsbereich (quick-261009-ikt).
* Der erste Reiter „Dateien“ sammelt alles; die weiteren Reiter arbeiten auf dieser Liste.
* Die Liste lebt nur im Arbeitsspeicher dieses Browserfensters; Reiterwechsel behaelt sie.
*/
@@ -1,5 +1,5 @@
/**
* Arbeitsbereich des Zertifikat-Managers (quick-261009-ikt, D-01, D-17, D-23).
* Arbeitsbereich des Zertifikatsmanagers (quick-261009-ikt, D-01, D-17, D-23).
*
* Reine Funktionen ohne React: eine Liste von Eintraegen, die nur wachsen oder gezielt
* schrumpfen kann. Eine zweite Auswahl haengt an, sie ersetzt nie die erste.
@@ -19,7 +19,7 @@ interface FileDropAreaProps {
/**
* Ablageflaeche fuer eine einzelne Datei (Finanzbuchhaltungs-Module,
* quick-261002-fm5). Eigenstaendig, ohne Texte aus einem anderen Modul —
* Bauform wie die Ablage des Zertifikat-Managers: echte Schaltflaeche fuer
* Bauform wie die Ablage des Zertifikatsmanagers: echte Schaltflaeche fuer
* Klick UND Ziehen, Entfernen als Geschwister daneben.
*/
export function FileDropArea({
@@ -6,7 +6,7 @@ interface TabBarProps<T extends string> {
onChange: (id: T) => void;
}
/** Reiterleiste der Finanzbuchhaltungs-Module — Muster Zertifikat-Manager. */
/** Reiterleiste der Finanzbuchhaltungs-Module — Muster Zertifikatsmanager. */
export function TabBar<T extends string>({ tabs, active, onChange }: TabBarProps<T>) {
return (
<nav className="flex gap-6 overflow-x-auto border-b border-border">
+1 -1
View File
@@ -6,7 +6,7 @@
export const ACCOUNTING_API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3001';
/** Dateiantwort der API (Base64) — wie beim Zertifikat-Manager. */
/** Dateiantwort der API (Base64) — wie beim Zertifikatsmanager. */
export interface FileResponse {
filename: string;
content: string;
+1 -1
View File
@@ -4,7 +4,7 @@
* Clientseitiger Blob-Download: Object-URL plus Anker mit `download`-Attribut.
* Genau dieser Weg wird vom Desktop-Client seit 1.9.2 als Datei gespeichert —
* deshalb keine Tauri-spezifische Sonderbehandlung. Gleicher Koerper wie
* `downloadBase64` im Zertifikat-Manager.
* `downloadBase64` im Zertifikatsmanager.
*/
export function downloadBase64(filename: string, content: string, mimeType: string): void {
const bytes = atob(content);
+1 -1
View File
@@ -1249,7 +1249,7 @@
"openDetail": "Details zu {name} öffnen"
},
"certManager": {
"title": "Zertifikat-Manager",
"title": "Zertifikatsmanager",
"description": "Zertifikate, Zwischenzertifikate, Schlüssel und Anfragen sammeln, prüfen und in das gewünschte Format bringen.",
"tabs": {
"files": "Dateien",
+1 -1
View File
@@ -243,7 +243,7 @@ export const UMLAUT_ALLOWLIST: readonly string[] = [
'Suchergebnisse',
// quick-261009-dkv (Aufgabe 2): Links und Übersichten — korrektes Deutsch mit „ss“
'verlassen',
// quick-261009-ikt: Zertifikat-Manager — korrektes Deutsch mit „ss“
// quick-261009-ikt: Zertifikatsmanager — korrektes Deutsch mit „ss“
'Schlüsseltyp',
'passende',
'passenden',
+3 -3
View File
@@ -13,7 +13,7 @@ Diese Anleitung richtet sich an alle Kolleginnen und Kollegen, die Tessera im Ar
6. [Die Module](#die-module)
- [Ausschreibungs-Radar](#ausschreibungs-radar)
- [DKV-Rechnung](#dkv-rechnung)
- [Zertifikat-Manager](#zertifikat-manager)
- [Zertifikatsmanager](#zertifikatsmanager)
- [Domaincheck](#domaincheck)
- [Domains](#domains)
- [Proxmox](#proxmox)
@@ -147,9 +147,9 @@ Das Modul prüft automatisch ein Postfach auf eingehende DKV-Tankkarten-Rechnung
- **Fahrzeuge:** Im Tab „Fahrzeuge" pflegen Sie die Fahrzeug-Stammdaten (Kennzeichen, Marke, Modell, Fahrer) — einzeln oder per CSV-Import (Format: `Kennzeichen;Marke;Modell;Fahrer`). Beim Import wählen Sie zwischen „Zusammenführen" (neue Fahrzeuge ergänzen, vorhandene bleiben) und „Ersetzen" (alle vorhandenen Fahrzeuge werden ersetzt — vor dieser Aktion erscheint eine Sicherheitsabfrage, da sie nicht rückgängig gemacht werden kann).
- **Moduleinstellungen:** Hier wird die Verbindung zum Postfach konfiguriert (Protokoll, Host, Zugangsdaten, Abrufintervall) sowie der Export-Empfänger, an den die verarbeiteten Rechnungen weitergeleitet werden.
### Zertifikat-Manager
### Zertifikatsmanager
Der Zertifikat-Manager hilft Ihnen, Zertifikate, Schlüssel und Zertifikatsanfragen zu prüfen, zu ordnen und in das Format zu bringen, das Ihr Server braucht. Er arbeitet mit **einer gemeinsamen Liste von Dateien**: Sie laden Ihre Dateien einmal im ersten Reiter hoch, und alle anderen Reiter arbeiten mit dieser Liste. Es gibt sechs Reiter, in dieser Reihenfolge: **Dateien**, **Analysieren**, **Aufteilen**, **Zusammenführen**, **Konvertieren** und **Vorlagen**. Ist die Liste noch leer, weisen die anderen Reiter freundlich auf den Reiter „Dateien“ hin. Wenn Sie zwischen den Reitern wechseln, bleibt die Liste erhalten.
Der Zertifikatsmanager hilft Ihnen, Zertifikate, Schlüssel und Zertifikatsanfragen zu prüfen, zu ordnen und in das Format zu bringen, das Ihr Server braucht. Er arbeitet mit **einer gemeinsamen Liste von Dateien**: Sie laden Ihre Dateien einmal im ersten Reiter hoch, und alle anderen Reiter arbeiten mit dieser Liste. Es gibt sechs Reiter, in dieser Reihenfolge: **Dateien**, **Analysieren**, **Aufteilen**, **Zusammenführen**, **Konvertieren** und **Vorlagen**. Ist die Liste noch leer, weisen die anderen Reiter freundlich auf den Reiter „Dateien“ hin. Wenn Sie zwischen den Reitern wechseln, bleibt die Liste erhalten.
**Wichtig zu Schlüsseln und Passwörtern:** Die Liste lebt nur im Arbeitsspeicher Ihres Browserfensters. Private Schlüssel und Passwörter werden von Tessera nirgends gespeichert und in keinem Protokoll festgehalten. Laden Sie die Seite neu oder schließen Sie das Fenster, ist die Liste weg, und Sie laden Ihre Dateien bei Bedarf noch einmal hoch.
+5 -5
View File
@@ -196,12 +196,12 @@ Das Modul „Dateien“ spricht aus dem `api`-Container mit der Nextcloud der In
- **Brute-Force-Ausnahme in der Nextcloud:** Tragen Sie die Adresse des Tessera-Servers dort in die Ausnahmeliste ein (Administrationshandbuch, Abschnitt „Dateien: Nextcloud anbinden“). Sonst kann eine Reihe falscher Anmeldungen die Nextcloud für alle Benutzer gleichzeitig sperren.
- **Verschlüsselung:** Die gespeicherten App-Passwörter sind mit `TESSERA_ENCRYPTION_KEY` verschlüsselt (Kapitel 2). Ein anderer Schlüssel macht sie unlesbar; die Benutzer müssen sich dann neu verbinden.
### Zertifikat-Manager
### Zertifikatsmanager
Das Modul „Zertifikat-Manager“ braucht keine Einstellungen und keine eigene Konfiguration. Es speichert nichts: Zertifikate, Schlüssel und Passwörter kommen mit jeder Anfrage aus dem Browser, werden im Arbeitsspeicher des `api`-Containers verarbeitet und nicht in der Datenbank oder in Protokollen abgelegt. Für den Betrieb gilt:
Das Modul „Zertifikatsmanager“ braucht keine Einstellungen und keine eigene Konfiguration. Es speichert nichts: Zertifikate, Schlüssel und Passwörter kommen mit jeder Anfrage aus dem Browser, werden im Arbeitsspeicher des `api`-Containers verarbeitet und nicht in der Datenbank oder in Protokollen abgelegt. Für den Betrieb gilt:
- **Größe der Anfragen:** Die Dateien gehen über `/api-proxy` an die API. Eine einzelne Analyse schickt höchstens 10 MB (höchstens 30 Dateien, je Datei bis 5 MB). Die Voraussetzung am Proxy ist dieselbe wie im Abschnitt „Dateien (Nextcloud)“: `client_max_body_size` von mindestens `10m`. Beim Herunterladen eines Ergebnisses schickt der Browser nur Zertifikate und höchstens einen Schlüssel als JSON, höchstens 512 KiB je Anfrage (Tessera legt für genau diese Anfrage eine eigene Grenze fest, alle anderen JSON-Anfragen bleiben bei 100 kB).
- **Ausgehender Zugriff:** Der Zertifikat-Manager ruft von sich aus nichts im Internet ab. Eine Ausnahme gibt es: Klickt ein Benutzer auf „Fehlendes Zertifikat holen“, schickt der `api`-Container eine einzelne Anfrage an die Adresse, die im Zertifikat als Aussteller-Adresse steht (meist `http://`, selten `https://`). Dafür muss der `api`-Container ausgehend per HTTP und HTTPS (Ports 80 und 443) ins Internet kommen; andere Ports ruft Tessera nie ab. Ist das ausgehend gesperrt (Firewall, Proxy-Pflicht), meldet der Knopf „nicht erreichbar“, alles andere im Modul funktioniert weiter, und die Benutzer laden das Zertifikat selbst herunter. Tessera ruft dabei nur öffentliche Adressen ab (keine internen Rechner, keine Adressen des eigenen Netzes), prüft die Adresse im Moment des Verbindens noch einmal, folgt höchstens drei Weiterleitungen, begrenzt Wartezeit (8 Sekunden) und Antwortgröße (256 KiB) und übernimmt nur ein Zertifikat, das das betroffene Zertifikat wirklich ausgestellt hat. Im Protokoll steht bei einem Fehler genau eine Zeile mit dem Servernamen und einem Fehlercode, nie ein Zertifikat.
- **Ausgehender Zugriff:** Der Zertifikatsmanager ruft von sich aus nichts im Internet ab. Eine Ausnahme gibt es: Klickt ein Benutzer auf „Fehlendes Zertifikat holen“, schickt der `api`-Container eine einzelne Anfrage an die Adresse, die im Zertifikat als Aussteller-Adresse steht (meist `http://`, selten `https://`). Dafür muss der `api`-Container ausgehend per HTTP und HTTPS (Ports 80 und 443) ins Internet kommen; andere Ports ruft Tessera nie ab. Ist das ausgehend gesperrt (Firewall, Proxy-Pflicht), meldet der Knopf „nicht erreichbar“, alles andere im Modul funktioniert weiter, und die Benutzer laden das Zertifikat selbst herunter. Tessera ruft dabei nur öffentliche Adressen ab (keine internen Rechner, keine Adressen des eigenen Netzes), prüft die Adresse im Moment des Verbindens noch einmal, folgt höchstens drei Weiterleitungen, begrenzt Wartezeit (8 Sekunden) und Antwortgröße (256 KiB) und übernimmt nur ein Zertifikat, das das betroffene Zertifikat wirklich ausgestellt hat. Im Protokoll steht bei einem Fehler genau eine Zeile mit dem Servernamen und einem Fehlercode, nie ein Zertifikat.
- **Rechenaufwand:** Passwortgeschützte PFX-Dateien und verschlüsselte Schlüssel öffnet Tessera mit den eingegebenen Passwörtern (je Datei höchstens zehn verschiedene Versuche); das kostet kurz Rechenzeit, belastet den Server aber nicht dauerhaft. Damit eine präparierte Datei die API nicht ausbremsen kann, gelten Grenzen je Anfrage: eine Passwortableitung höchstens eine Million Runden, alle zusammen höchstens sechs Millionen (mehr überspringt Tessera mit Hinweis), höchstens 200 Zertifikate, 50 Schlüssel und 50 Zertifikatsanfragen sowie 20 MiB für alle Dateien zusammen (Tessera bricht schon beim Empfang ab, mit der Meldung zu große Dateien, HTTP 413). ZIP-Dateien werden mit hartem Deckel entpackt (1 MiB je Eintrag, 20 MiB zusammen).
## 4. Neue Fassung einspielen
@@ -773,7 +773,7 @@ Für die Desktop-Auslieferung ist keine neue Pflichtvariable nötig.
| `/api-proxy/desktop/update` antwortet dauerhaft `204`, obwohl Pakete da sind | Manifest ohne `signature`/`updateVersion`: Pakete aus einem Bau vor der Update-Funktion oder mit `--no-sign` | Eine Änderung unter `apps/desktop/` pushen bzw. den Tag neu bauen lassen; im CI prüfen, dass die Secrets `TAURI_SIGNING_PRIVATE_KEY`/`_PASSWORD` gesetzt sind (Abschnitt „Updates in der App und der Signierschlüssel"). |
| Eine Fehlermeldung aus der Desktop-App nennt als Herkunft „Desktop-App (unbekannt)“ ohne Version, Betreff-Kürzel `[Desktop]` | Der Client ist älter als diese Fassung: er meldet dem Server beim Start nur `desktop=1`, nicht Version, Stand und Betriebssystem (Parameter `dv`, `dc`, `dos`, aus denen `web` das Cookie `tessera_desktop_client` bildet) | Kein Fehler, die Meldung ist trotzdem als Desktop-App erkennbar. Client über „Auf Version … aktualisieren“ im Infobereich oder den Browser-Installer aktualisieren; danach stehen Betriebssystem, Version und Stand in der Meldung. |
| Beim Hochladen in „Dateien“ bricht jede größere Datei beim ersten 8-MB-Stück ab (Fehler „Die Verbindung wurde unterbrochen“, im Proxy-Protokoll `413`) | Der Proxy vor Tessera (Nginx Proxy Manager) lässt keine Anfragen über seiner Größengrenze durch (`client_max_body_size`), oder sein Zeitlimit ist zu kurz | Für die Tessera-Adresse `client_max_body_size` auf mindestens `10m` und die Lese-/Sendezeitlimits auf mindestens 120 Sekunden stellen (Kapitel 3, Abschnitt „Dateien (Nextcloud)“). |
| Im Zertifikat-Manager bricht das Hochladen mehrerer Dateien ab (Fehlertext „Die Dateien sind zusammen zu groß“ oder `413` im Proxy-Protokoll) | Der Proxy vor Tessera (Nginx Proxy Manager) lässt Anfragen über seiner Größengrenze nicht durch (`client_max_body_size`); die Analyse schickt bis zu 10 MB | Für die Tessera-Adresse `client_max_body_size` auf mindestens `10m` stellen (Kapitel 3, Abschnitt „Dateien (Nextcloud)“); Tessera selbst erlaubt höchstens 20 MB je Analyse. |
| Im Zertifikat-Manager meldet „Fehlendes Zertifikat holen“, der Server des Ausstellers sei nicht erreichbar | Der `api`-Container kommt ausgehend nicht per HTTP/HTTPS (Ports 80 und 443) ins Internet, oder der Server des Ausstellers antwortet nicht; steht die Meldung, die Adresse werde nicht abgerufen, zeigt die Adresse im Zertifikat auf einen internen Rechner oder einen besonderen Anschluss, was Tessera absichtlich nie abruft | Ausgehenden Zugriff für den `api`-Container freigeben (`docker compose exec api node -e "fetch('http://ye2.i.lencr.org/').then(r=>console.log(r.status))"` muss `200` ausgeben); sonst das Zertifikat beim Aussteller herunterladen und im Reiter „Dateien“ hinzufügen. |
| Im Zertifikatsmanager bricht das Hochladen mehrerer Dateien ab (Fehlertext „Die Dateien sind zusammen zu groß“ oder `413` im Proxy-Protokoll) | Der Proxy vor Tessera (Nginx Proxy Manager) lässt Anfragen über seiner Größengrenze nicht durch (`client_max_body_size`); die Analyse schickt bis zu 10 MB | Für die Tessera-Adresse `client_max_body_size` auf mindestens `10m` stellen (Kapitel 3, Abschnitt „Dateien (Nextcloud)“); Tessera selbst erlaubt höchstens 20 MB je Analyse. |
| Im Zertifikatsmanager meldet „Fehlendes Zertifikat holen“, der Server des Ausstellers sei nicht erreichbar | Der `api`-Container kommt ausgehend nicht per HTTP/HTTPS (Ports 80 und 443) ins Internet, oder der Server des Ausstellers antwortet nicht; steht die Meldung, die Adresse werde nicht abgerufen, zeigt die Adresse im Zertifikat auf einen internen Rechner oder einen besonderen Anschluss, was Tessera absichtlich nie abruft | Ausgehenden Zugriff für den `api`-Container freigeben (`docker compose exec api node -e "fetch('http://ye2.i.lencr.org/').then(r=>console.log(r.status))"` muss `200` ausgeben); sonst das Zertifikat beim Aussteller herunterladen und im Reiter „Dateien“ hinzufügen. |
| In „Dateien“ tragen öffentliche Links eine interne Adresse (zum Beispiel ein interner Rechnername oder eine IP-Adresse) und lassen sich von außen nicht öffnen | Die Nextcloud baut die Adresse eines Links aus dem Namen, unter dem Tessera sie aufruft; in Tessera ist die interne Adresse der Nextcloud eingetragen | In den Einstellungen des Moduls die von außen erreichbare Adresse der Nextcloud eintragen, oder in der `config.php` der Nextcloud `overwritehost`, `overwriteprotocol` und `overwrite.cli.url` auf die externe Adresse setzen; bereits erstellte Links ändern sich nicht rückwirkend, sie müssen neu erstellt werden. |
| In „Dateien“ erscheint „Sie haben in kurzer Zeit viele Freigaben angelegt. Bitte warten Sie einige Minuten.“ | Tessera hat für den Benutzer 10 neue Freigaben innerhalb von 10 Minuten angelegt oder mehr als 40 Versuche in 10 Minuten gezählt (auch abgelehnte) | Einige Minuten abwarten (der Zähler läuft nach 10 Minuten ab); ein Neustart des `api`-Containers setzt den Zähler zurück, ist aber nur im Ausnahmefall nötig. |
+2 -2
View File
@@ -271,7 +271,7 @@ Details dazu im Abschnitt [Das Modulsystem](#das-modulsystem).
## Das Modulsystem
Module sind das zentrale Organisationsprinzip von Tessera: fachliche Werkzeuge (Domaincheck,
Zertifikat-Manager, DKV-Rechnung, Ausschreibungs-Radar), die im Marktplatz erscheinen, pro Mandant
Zertifikatsmanager, DKV-Rechnung, Ausschreibungs-Radar), die im Marktplatz erscheinen, pro Mandant
aktiviert und dann einzelnen Gruppen oder Benutzern freigegeben werden.
### Registrierung
@@ -871,7 +871,7 @@ Nextcloud (`ratelimit.protection.enabled`) nur für den Lauf aus und stellt die
Tessera liegt im Prozess: `all` verbraucht 7 der 10 Plätze, nach jedem `all`-Lauf
`docker compose restart api`.
**Zertifikat-Manager, Arbeitsbereich und Ketten (quick-261009-ikt):** Der Zertifikat-Manager
**Zertifikatsmanager, Arbeitsbereich und Ketten (quick-261009-ikt):** Der Zertifikatsmanager
(`apps/api/src/cert-manager`, `apps/web/src/app/(portal)/modules/cert-manager`) hält **nichts**
auf dem Server. Die Oberfläche führt eine Liste von Dateien nur im Arbeitsspeicher des Browsers
(`use-cert-workspace.ts`, rein mit `working-set.ts`) und schickt bei jeder Änderung die ganze Liste