
Boîte à outils PKI côté client qui décode les artefacts X.509, CSR, chaîne, CRL, PKCS#7 et PKCS#12, visualise l'ASN.1, convertit les formats et génère des certificats auto-signés dans le navigateur.
Une boîte à outils auto-hébergée, 100 % côté client pour les artefacts PKI : certificats X.509, CSR PKCS#10, chaînes, CRL, bundles PKCS#7 et PKCS#12, ASN.1 brut, conversion de format, empreintes et émission de certificats. Une alternative respectueuse de la vie privée et auto-hébergeable aux décodeurs de certificats en ligne.
Démo en ligne : https://pki-toolbox.youkyi.net (la démo est le même build statique que vous pouvez auto-héberger ci-dessous ; rien de ce que vous collez ne quitte votre navigateur).
Chaque octet est analysé à l'intérieur de votre navigateur avec @peculiar/x509 et pkijs. Rien n'est jamais téléversé, le backend ne sert que des fichiers statiques. Vous n'êtes pas obligé de nous croire sur parole : voir Confidentialité vérifiable ci-dessous.
| Outil | Catégorie | Description |
|---|
| Décodeur de certificat | Décodage | Chaque champ d'un certificat X.509 : sujet, émetteur, validité, SANs, usage de clé, empreintes |
| Décodeur de CSR | Décodage | Sujet, clé publique, algorithme de signature et extensions demandées d'une requête PKCS#10 |
| Décodeur de chaîne | Décodage | Découpe un bundle PEM concaténé en une chaîne ordonnée et vérifie chaque lien émetteur-vers-sujet |
| Décodeur de CRL | Décodage | Entrées révoquées, dates et motifs de révocation |
| Décodeur PKCS#7 | Décodage | Chaque certificat porté par un bundle PKCS#7 / CMS |
| Décodeur PKCS#12 | Décodage | Ouvre les fichiers .p12 / .pfx protégés par mot de passe |
| Empreintes | Inspection | SHA-1 / SHA-256 / SHA-512 du DER |
| Visionneuse ASN.1 | Inspection | Arbre tag/longueur/valeur dépliable de tout artefact DER |
| Conversion de format | Conversion | PEM ↔ DER ↔ PKCS#7 |
| Certificat auto-signé | Génération | Certificat auto-signé et paire de clés (RSA / EC / Ed25519) via WebCrypto |
| Signer depuis une CA | Génération | Émet un certificat depuis une CA existante : nouvelle paire de clés ou CSR, feuille ou intermédiaire, avec un fullchain prêt à l'emploi |
Le catalogue vit dans un registre unique (src/lib/tools.ts) qui pilote la barre de navigation et la grille d'accueil.
Autour des outils eux-mêmes :
src/lib/pki/detect.ts) et s'ouvre dans l'outil qui le lit./ place le curseur dans le champ de saisie.L'affirmation « il ne quitte jamais votre navigateur » est vérifiable depuis la page elle-même :
connect-src de la page depuis la politique avec laquelle elle a été servie, compte les requêtes capables d'exfiltrer des données depuis votre collage, et exécute une tentative en direct que le navigateur refuse devant vous, en citant la directive qui l'a bloquée.Exécutez toujours un tag de release épinglé et immuable (vX.Y.Z), jamais latest : un tag mouvant ne peut être audité ni annulé. Pour la garantie la plus forte, épinglez le digest de l'image (...@sha256:...).
docker run -p 8080:8080 ghcr.io/youkyi/pki-toolbox:v2.2.0
Puis ouvrez http://localhost:8080.
Chaque release est publiée, sous le même tag immuable vX.Y.Z, sur :
| Registre | Image |
|---|---|
| GitHub Container Registry | ghcr.io/youkyi/pki-toolbox |
| Docker Hub | youkyi/pki-toolbox |
docker pull ghcr.io/youkyi/pki-toolbox:v2.2.0 # ou
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
Le dépôt fournit un docker-compose.yml entièrement durci (système de fichiers racine en lecture seule, capacités supprimées, limites de mémoire et de CPU) ; utilisez ce fichier directement plutôt que cet exemple minimal.
L'image est construite à partir de nginx:alpine-slim, pèse environ 25 Mo, écoute sur le port non privilégié 8080 et s'exécute en tant qu'utilisateur non-root.
Nécessite Node 24 (la version avec laquelle l'image et la CI sont construites) et pnpm 11. La version exacte de pnpm est épinglée par le champ packageManager de package.json, donc corepack enable suffit pour l'obtenir.
pnpm install
pnpm dev # serveur de dev sur http://localhost:5173
pnpm test # tests unitaires, exécution unique (Vitest)
pnpm test:unit # les mêmes tests, en mode watch
pnpm test:e2e # tests de bout en bout (Playwright)
pnpm test:e2e:ui # les mêmes, dans l'interface Playwright
pnpm check # svelte-check / TypeScript
pnpm lint # Prettier + ESLint
pnpm format # réécrit les fichiers avec Prettier
pnpm build # build statique dans ./build
pnpm preview # sert ./build localement
docker build -t pki-toolbox .
docker run -p 8080:8080 pki-toolbox
adapter-static en HTML/JS pur : chaque route est prérendue et il n'y a aucun runtime Node en production.src/lib/pki/, sans import Svelte : parse.ts, chain.ts, crl.ts, pkcs7.ts, pkcs12.ts, asn1.ts, convert.ts, format.ts, pem.ts, oids.ts, detect.ts, generate.ts et sign.ts. Chaque route sous src/routes/ est une fine coquille d'interface autour d'elles.@peculiar/x509 v2 construit ses objets via tsyringe, qui nécessite un polyfill de métadonnées Reflect côté consommateur, donc @abraham/reflection est importé avant lui dans chaque module qui utilise la bibliothèque.pkijs, dont le moteur Web Crypto est enregistré une fois dans src/lib/pki/engine.ts.tests/pki/ (Vitest) et les tests navigateur dans e2e/ (Playwright). Les fixtures sont de vraies racines publiques (ISRG Root X1/X2) plus une chaîne EC et un CSR générés, voir scripts/generate-fixtures.mjs.<meta> avec connect-src 'none' ; nginx ajoute frame-ancestors 'none', X-Frame-Options, X-Content-Type-Options, Referrer-Policy: no-referrer, une Permissions-Policy restrictive et les en-têtes d'isolation cross-origin. La démo Vercel envoie le même jeu d'en-têtes (voir vercel.json).docker-compose.yml fourni ajoute un système de fichiers racine en lecture seule, cap_drop: ALL, no-new-privileges et des limites de ressources.trivy fs) et sur l'image fraîchement construite, qui est également rejetée lorsque son OS de base est en fin de vie, ainsi une image vulnérable n'est jamais poussée. Les licences sont scannées dans une passe séparée et non bloquante.Ce projet suit le Semantic Versioning et les Conventional Commits. Les changements notables sont consignés dans CHANGELOG.md. Les règles de contribution se trouvent dans CONTRIBUTING.md.
CHANGELOG.md, renommez le titre ## [Unreleased] avec la nouvelle version et la date du jour, par ex. ## [1.2.3] - 2026-06-01, ajoutez un nouveau ## [Unreleased] vide au-dessus, et mettez à jour les références de liens en bas du fichier."version" dans package.json au même numéro.main (un commit conventionnel, par ex. chore(release): 1.2.3) et poussez.git tag -a v1.2.3 -m "pki-toolbox v1.2.3"
git push origin v1.2.3
Lint, tests unitaires et tests de bout en bout s'exécutent à chaque push. Les étapes de scan, build et release proviennent des composants partagés YouKyi-Infra/ci-infrastructure/ci-catalog (trivy-scan, docker-build, gitlab-release), épinglés par version dans .gitlab-ci.yml.
Un tag vX.Y.Z exécute toute la chaîne : scan, build de l'image, scan de l'image, push de vX.Y.Z vers le registre GitLab et vers les miroirs publics (ghcr.io, Docker Hub), puis une GitLab Release dont les notes sont la section ## [X.Y.Z] correspondante extraite de CHANGELOG.md (une section vide fait échouer le job plutôt que de publier des notes vides).
Un push sur main exécute le même pipeline moins l'étape de release, et le job d'image ne s'exécute que lorsqu'un fichier affectant le build a changé, ainsi un push de docs ou de config uniquement ne reconstruit pas l'image.
Les dépendances sont maintenues à jour par Renovate, qui étend le preset partagé Renovate-Bot/renovate-config (voir renovate.json).