
Caja de herramientas PKI del lado del cliente que decodifica artefactos X.509, CSR, cadena, CRL, PKCS#7 y PKCS#12, visualiza ASN.1, convierte formatos y genera certificados autofirmados en el navegador.
Una caja de herramientas autoalojada y 100 % del lado del cliente para artefactos PKI: certificados X.509, CSR PKCS#10, cadenas, CRL, paquetes PKCS#7 y PKCS#12, ASN.1 en bruto, conversión de formatos, huellas digitales y emisión de certificados. Una alternativa respetuosa con la privacidad y autoalojable a los decodificadores de certificados en línea.
Demo en vivo: https://pki-toolbox.youkyi.net (la demo es la misma compilación estática que puedes autoalojar a continuación; nada de lo que pegues sale de tu navegador).
Cada byte se analiza dentro de tu navegador con @peculiar/x509 y pkijs. Nunca se sube nada, el backend solo sirve archivos estáticos. No tienes que confiar en nuestra palabra: consulta Privacidad verificable más abajo.
| Herramienta | Categoría | Descripción |
|---|
| Decodificador de certificados | Decodificación | Todos los campos de un certificado X.509: sujeto, emisor, validez, SANs, uso de clave, huellas digitales |
| Decodificador de CSR | Decodificación | Sujeto, clave pública, algoritmo de firma y extensiones solicitadas de una petición PKCS#10 |
| Decodificador de cadena | Decodificación | Divide un paquete PEM concatenado en una cadena ordenada y verifica cada enlace emisor-a-sujeto |
| Decodificador de CRL | Decodificación | Entradas revocadas, fechas y motivos de revocación |
| Decodificador PKCS#7 | Decodificación | Cada certificado contenido en un paquete PKCS#7 / CMS |
| Decodificador PKCS#12 | Decodificación | Abre archivos .p12 / .pfx protegidos con contraseña |
| Huellas digitales | Inspección | SHA-1 / SHA-256 / SHA-512 del DER |
| Visor ASN.1 | Inspección | Árbol expandible de etiqueta/longitud/valor de cualquier artefacto DER |
| Conversión de formato | Conversión | PEM ↔ DER ↔ PKCS#7 |
| Certificado autofirmado | Generación | Certificado autofirmado y par de claves (RSA / EC / Ed25519) mediante WebCrypto |
| Firmar desde una CA | Generación | Emite un certificado desde una CA existente: nuevo par de claves o CSR, hoja o intermedio, con una cadena completa lista para usar |
El catálogo vive en un único registro (src/lib/tools.ts) que controla la barra de navegación y la cuadrícula de inicio.
Alrededor de las herramientas en sí:
src/lib/pki/detect.ts) y se abre en la herramienta que lo lee./ coloca el cursor en la entrada.La afirmación "nunca sale de tu navegador" es verificable desde dentro de la página:
connect-src de la propia página desde la política con la que fue servida, cuenta las peticiones capaces de sacar datos desde que pegaste, y ejecuta un intento en vivo que el navegador rechaza delante de ti, citando la directiva que lo bloqueó.Ejecuta siempre una etiqueta de versión fijada e inmutable (vX.Y.Z), nunca latest: una etiqueta móvil no puede auditarse ni revertirse. Para la garantía más fuerte, fija el digest de la imagen (...@sha256:...).
docker run -p 8080:8080 ghcr.io/youkyi/pki-toolbox:v2.2.0
Luego abre http://localhost:8080.
Cada versión se publica, bajo la misma etiqueta inmutable vX.Y.Z, en:
| Registro | Imagen |
|---|---|
| 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
El repositorio incluye un docker-compose.yml totalmente endurecido (sistema de archivos raíz de solo lectura, capacidades eliminadas, límites de memoria y CPU); usa ese archivo directamente en lugar de este ejemplo mínimo.
La imagen se construye a partir de nginx:alpine-slim, pesa unos 25 MB, escucha en el puerto no privilegiado 8080 y se ejecuta como usuario no root.
Requiere Node 24 (la versión con la que se construyen la imagen y CI) y pnpm 11. La versión exacta de pnpm está fijada por el campo packageManager de package.json, por lo que corepack enable es suficiente para obtenerla.
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 a HTML/JS plano: cada ruta se prerrenderiza y no hay runtime de Node en producción.src/lib/pki/, sin importación de 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 y sign.ts. Cada ruta bajo src/routes/ es una fina capa de UI alrededor de ellas.@peculiar/x509 v2 construye sus objetos a través de tsyringe, que necesita un polyfill de metadatos Reflect en el lado del consumidor, por lo que @abraham/reflection se importa antes que él en cada módulo que usa la biblioteca.pkijs, cuyo motor de Web Crypto se registra una vez en src/lib/pki/engine.ts.tests/pki/ (Vitest) y las pruebas de navegador en e2e/ (Playwright). Los fixtures son raíces públicas reales (ISRG Root X1/X2) más una cadena EC y un CSR generados, consulta scripts/generate-fixtures.mjs.<meta> con connect-src 'none'; nginx añade frame-ancestors 'none', X-Frame-Options, X-Content-Type-Options, Referrer-Policy: no-referrer, una Permissions-Policy restrictiva y las cabeceras de aislamiento entre orígenes. La demo de Vercel envía el mismo conjunto de cabeceras (consulta vercel.json).docker-compose.yml incluido añade un sistema de archivos raíz de solo lectura, cap_drop: ALL, no-new-privileges y límites de recursos.trivy fs) como en la imagen recién construida, que también se rechaza cuando su SO base está al final de su vida útil, de modo que nunca se publica una imagen vulnerable. Las licencias se escanean en una pasada separada y no bloqueante.Este proyecto sigue Semantic Versioning y Conventional Commits. Los cambios notables se registran en CHANGELOG.md. Las reglas de contribución están en CONTRIBUTING.md.
CHANGELOG.md, renombra el encabezado ## [Unreleased] a la nueva versión con la fecha de hoy, p. ej. ## [1.2.3] - 2026-06-01, añade un nuevo ## [Unreleased] vacío encima, y actualiza las referencias de enlaces al final del archivo."version" en package.json al mismo número.main (un commit convencional, p. ej. chore(release): 1.2.3) y haz push.git tag -a v1.2.3 -m "pki-toolbox v1.2.3"
git push origin v1.2.3
Lint, pruebas unitarias y pruebas de extremo a extremo se ejecutan en cada push. Las etapas de escaneo, construcción y publicación provienen de los componentes compartidos YouKyi-Infra/ci-infrastructure/ci-catalog (trivy-scan, docker-build, gitlab-release), fijados por versión en .gitlab-ci.yml.
Una etiqueta vX.Y.Z ejecuta toda la cadena: escaneo, construcción de imagen, escaneo de imagen, push de vX.Y.Z al registro de GitLab y a los espejos públicos (ghcr.io, Docker Hub), luego una GitLab Release cuyas notas son la sección ## [X.Y.Z] correspondiente extraída de CHANGELOG.md (una sección vacía hace fallar el job en lugar de publicar notas vacías).
Un push a main ejecuta el mismo pipeline menos el paso de publicación, y el job de imagen solo se ejecuta cuando cambió un archivo que afecta a la construcción, de modo que un push solo de documentación o configuración no reconstruye la imagen.
Las dependencias se mantienen actualizadas por Renovate, que extiende el preset compartido Renovate-Bot/renovate-config (consulta renovate.json).