
Clientseitige PKI-Toolbox, die X.509-, CSR-, Chain-, CRL-, PKCS#7- und PKCS#12-Artefakte dekodiert, ASN.1 anzeigt, Formate konvertiert und selbstsignierte Zertifikate im Browser generiert.
Eine selbst gehostete, 100 % clientseitige Toolbox für PKI-Artefakte: X.509-Zertifikate, PKCS#10-CSRs, Ketten, CRLs, PKCS#7- und PKCS#12-Bundles, rohes ASN.1, Formatkonvertierung, Fingerabdrücke und Zertifikatsausstellung. Ein datenschutzfreundlicher, selbst hostbarer Ersatz für Online-Zertifikatsdecoder.
Live-Demo: https://pki-toolbox.youkyi.net (die Demo ist derselbe statische Build, den Sie unten selbst hosten können; nichts, was Sie einfügen, verlässt Ihren Browser).
Jedes Byte wird in Ihrem Browser mit @peculiar/x509 und pkijs geparst. Nichts wird jemals hochgeladen, das Backend liefert nur statische Dateien aus. Sie müssen das nicht einfach glauben: siehe Überprüfbare Privatsphäre unten.
| Tool | Kategorie | Beschreibung |
|---|
| Certificate decoder | Decoding | Jedes Feld eines X.509-Zertifikats: Subject, Issuer, Gültigkeit, SANs, Key Usage, Fingerabdrücke |
| CSR decoder | Decoding | Subject, öffentlicher Schlüssel, Signaturalgorithmus und angeforderte Erweiterungen einer PKCS#10-Anfrage |
| Chain decoder | Decoding | Zerlegt ein verkettetes PEM-Bundle in eine geordnete Kette und verifiziert jede Issuer-zu-Subject-Verknüpfung |
| CRL decoder | Decoding | Widerrufene Einträge, Daten und Widerrufsgründe |
| PKCS#7 decoder | Decoding | Jedes Zertifikat, das ein PKCS#7- / CMS-Bundle enthält |
| PKCS#12 decoder | Decoding | Öffnet passwortgeschützte .p12- / .pfx-Dateien |
| Fingerprints | Inspection | SHA-1 / SHA-256 / SHA-512 des DER |
| ASN.1 viewer | Inspection | Aufklappbarer Tag/Length/Value-Baum eines beliebigen DER-Artefakts |
| Format conversion | Conversion | PEM ↔ DER ↔ PKCS#7 |
| Self-signed certificate | Generation | Selbstsigniertes Zertifikat und Schlüsselpaar (RSA / EC / Ed25519) via WebCrypto |
| Sign from a CA | Generation | Stellt ein Zertifikat von einer bestehenden CA aus: neues Schlüsselpaar oder CSR, Leaf oder Intermediate, mit einsatzbereitem Fullchain |
Der Katalog lebt in einem einzigen Registry (src/lib/tools.ts), das die Navbar und das Home-Grid steuert.
Rund um die Tools selbst:
src/lib/pki/detect.ts) und öffnet sich im Tool, das es liest./ setzt den Cursor in die Eingabe.Die Behauptung "es verlässt niemals Ihren Browser" ist von innerhalb der Seite überprüfbar:
connect-src-Direktive der Seite aus der Richtlinie ausliest, mit der sie ausgeliefert wurde, die Anfragen zählt, die seit Ihrem Einfügen Daten nach außen tragen könnten, und einen Live-Versuch ausführt, den der Browser vor Ihnen verweigert, wobei die Direktive zitiert wird, die ihn blockiert hat.Führen Sie immer ein gepinntes, unveränderliches Release-Tag (vX.Y.Z) aus, niemals latest: ein bewegliches Tag kann nicht auditiert oder zurückgerollt werden. Für die stärkste Garantie pinnen Sie den Image-Digest (...@sha256:...).
docker run -p 8080:8080 ghcr.io/youkyi/pki-toolbox:v2.2.0
Öffnen Sie dann http://localhost:8080.
Jedes Release wird unter demselben unveränderlichen vX.Y.Z-Tag veröffentlicht bei:
| Registry | Image |
|---|---|
| GitHub Container Registry | ghcr.io/youkyi/pki-toolbox |
| Docker Hub | youkyi/pki-toolbox |
docker pull ghcr.io/youkyi/pki-toolbox:v2.2.0 # or
docker pull youkyi/pki-toolbox:v2.2.0
services:
pki-toolbox:
image: ghcr.io/youkyi/pki-toolbox:v2.2.0
ports:
- '8080:8080'
restart: unless-stopped
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
read_only: true
docker compose up -d
Das Repository liefert eine vollständig gehärtete docker-compose.yml (schreibgeschütztes Root-Dateisystem, entfernte Capabilities, Speicher- und CPU-Limits); verwenden Sie diese Datei direkt statt dieses minimale Beispiel.
Das Image wird aus nginx:alpine-slim gebaut, wiegt etwa 25 MB, lauscht auf dem nicht-privilegierten Port 8080 und läuft als Non-Root-Benutzer.
Erfordert Node 24 (die Version, mit der das Image und CI bauen) und pnpm 11. Die exakte pnpm-Version ist durch das packageManager-Feld von package.json gepinnt, sodass corepack enable ausreicht, um sie zu erhalten.
pnpm install
pnpm dev # dev server on http://localhost:5173
pnpm test # unit tests, single run (Vitest)
pnpm test:unit # the same tests, in watch mode
pnpm test:e2e # end-to-end tests (Playwright)
pnpm test:e2e:ui # the same, in the Playwright UI
pnpm check # svelte-check / TypeScript
pnpm lint # Prettier + ESLint
pnpm format # rewrite files with Prettier
pnpm build # static build into ./build
pnpm preview # serve ./build locally
docker build -t pki-toolbox .
docker run -p 8080:8080 pki-toolbox
adapter-static zu reinem HTML/JS: jede Route ist vorgerendert und es gibt keine Node-Runtime in der Produktion.src/lib/pki/, ohne Svelte-Import: parse.ts, chain.ts, crl.ts, pkcs7.ts, pkcs12.ts, asn1.ts, convert.ts, format.ts, pem.ts, oids.ts, detect.ts, generate.ts und sign.ts. Jede Route unter src/routes/ ist eine dünne UI-Hülle um sie herum.@peculiar/x509 v2 baut seine Objekte über tsyringe auf, was auf der Konsumentenseite einen Reflect-Metadata-Polyfill benötigt, daher wird @abraham/reflection in jedem Modul, das die Bibliothek verwendet, vor ihr importiert.pkijs, dessen Web-Crypto-Engine einmalig in src/lib/pki/engine.ts registriert wird.tests/pki/ (Vitest) und Browser-Tests in e2e/ (Playwright). Fixtures sind echte öffentliche Roots (ISRG Root X1/X2) plus eine generierte EC-Kette und CSR, siehe scripts/generate-fixtures.mjs.<meta>-Tag mit connect-src 'none' ausgegeben; nginx fügt frame-ancestors 'none', X-Frame-Options, X-Content-Type-Options, Referrer-Policy: no-referrer, eine restriktive Permissions-Policy und die Cross-Origin-Isolation-Header hinzu. Die Vercel-Demo sendet denselben Header-Satz (siehe vercel.json).docker-compose.yml fügt ein schreibgeschütztes Root-Dateisystem, cap_drop: ALL, no-new-privileges und Ressourcenlimits hinzu.trivy fs) als auch beim frisch gebauten Image, das zudem abgelehnt wird, wenn sein Basis-OS end-of-life ist, sodass ein verwundbares Image niemals gepusht wird. Lizenzen werden in einem separaten, nicht blockierenden Durchlauf gescannt.Dieses Projekt folgt Semantic Versioning und Conventional Commits. Bemerkenswerte Änderungen werden in CHANGELOG.md festgehalten. Beitragsregeln stehen in CONTRIBUTING.md.
CHANGELOG.md die Überschrift ## [Unreleased] in die neue Version mit dem heutigen Datum um, z. B. ## [1.2.3] - 2026-06-01, fügen Sie eine frische leere ## [Unreleased] darüber hinzu und aktualisieren Sie die Link-Referenzen am Ende der Datei."version" in package.json auf dieselbe Nummer.main (ein konventioneller Commit, z. B. chore(release): 1.2.3) und pushen Sie.git tag -a v1.2.3 -m "pki-toolbox v1.2.3"
git push origin v1.2.3
Lint, Unit-Tests und End-to-End-Tests laufen bei jedem Push. Die Scan-, Build- und Release-Stufen stammen aus den gemeinsamen YouKyi-Infra/ci-infrastructure/ci-catalog-Komponenten (trivy-scan, docker-build, gitlab-release), gepinnt per Version in .gitlab-ci.yml.
Ein vX.Y.Z-Tag durchläuft die gesamte Kette: Scan, Image-Build, Image-Scan, Push von vX.Y.Z zur GitLab-Registry und zu den öffentlichen Mirrors (ghcr.io, Docker Hub), dann ein GitLab Release, dessen Notes der passende ## [X.Y.Z]-Abschnitt aus CHANGELOG.md sind (ein leerer Abschnitt lässt den Job fehlschlagen, statt leere Notes zu veröffentlichen).
Ein Push auf main durchläuft dieselbe Pipeline ohne den Release-Schritt, und der Image-Job läuft nur, wenn sich eine Datei geändert hat, die den Build beeinflusst, sodass ein reiner Docs- oder Config-Push das Image nicht neu baut.
Abhängigkeiten werden von Renovate aktuell gehalten, das das gemeinsame Renovate-Bot/renovate-config-Preset erweitert (siehe renovate.json).