
Caixa de ferramentas PKI do lado do cliente que decodifica artefatos X.509, CSR, chain, CRL, PKCS#7 e PKCS#12, visualiza ASN.1, converte formatos e gera certificados autoassinados no navegador.
Uma caixa de ferramentas auto-hospedada, 100% do lado do cliente, para artefactos de PKI: certificados X.509, CSRs PKCS#10, cadeias, CRLs, pacotes PKCS#7 e PKCS#12, ASN.1 em bruto, conversão de formatos, impressões digitais e emissão de certificados. Uma alternativa respeitadora da privacidade e auto-hospedável aos descodificadores de certificados online.
Demonstração ao vivo: https://pki-toolbox.youkyi.net (a demonstração é a mesma compilação estática que pode auto-hospedar abaixo; nada do que colar sai do seu navegador).
Cada byte é analisado dentro do seu navegador com @peculiar/x509 e pkijs. Nada é alguma vez carregado, o backend apenas serve ficheiros estáticos. Não tem de acreditar na nossa palavra: veja Privacidade verificável abaixo.
| Ferramenta | Categoria | Descrição |
|---|
| Descodificador de certificados | Descodificação | Todos os campos de um certificado X.509: subject, issuer, validade, SANs, key usage, impressões digitais |
| Descodificador de CSR | Descodificação | Subject, chave pública, algoritmo de assinatura e extensões pedidas de um pedido PKCS#10 |
| Descodificador de cadeia | Descodificação | Divide um pacote PEM concatenado numa cadeia ordenada e verifica cada ligação issuer-to-subject |
| Descodificador de CRL | Descodificação | Entradas revogadas, datas e motivos de revogação |
| Descodificador de PKCS#7 | Descodificação | Todos os certificados transportados por um pacote PKCS#7 / CMS |
| Descodificador de PKCS#12 | Descodificação | Abre ficheiros .p12 / .pfx protegidos por palavra-passe |
| Impressões digitais | Inspeção | SHA-1 / SHA-256 / SHA-512 do DER |
| Visualizador ASN.1 | Inspeção | Árvore tag/length/value expansível de qualquer artefacto DER |
| Conversão de formatos | Conversão | PEM ↔ DER ↔ PKCS#7 |
| Certificado autoassinado | Geração | Certificado autoassinado e par de chaves (RSA / EC / Ed25519) via WebCrypto |
| Assinar a partir de uma CA | Geração | Emite um certificado a partir de uma CA existente: novo par de chaves ou CSR, leaf ou intermediate, com uma fullchain pronta a usar |
O catálogo vive num único registo (src/lib/tools.ts) que alimenta a barra de navegação e a grelha inicial.
Em torno das próprias ferramentas:
src/lib/pki/detect.ts) e abre na ferramenta que o lê./ coloca o cursor na entrada.A afirmação "nunca sai do seu navegador" é verificável a partir de dentro da página:
connect-src da página a partir da política com que foi servida, conta os pedidos capazes de transportar dados para fora desde que colou, e executa uma tentativa ao vivo que o navegador recusa à sua frente, citando a diretiva que a bloqueou.Execute sempre uma tag de release fixa e imutável (vX.Y.Z), nunca latest: uma tag móvel não pode ser auditada nem revertida. Para a garantia mais forte, fixe o digest da imagem (...@sha256:...).
docker run -p 8080:8080 ghcr.io/youkyi/pki-toolbox:v2.2.0
Depois abra http://localhost:8080.
Cada release é publicada, sob a mesma tag imutável vX.Y.Z, em:
| Registo | Imagem |
|---|---|
| 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
O repositório inclui um docker-compose.yml totalmente endurecido (sistema de ficheiros raiz só de leitura, capacidades removidas, limites de memória e CPU); use esse ficheiro diretamente em vez deste exemplo mínimo.
A imagem é construída a partir de nginx:alpine-slim, pesa cerca de 25 MB, escuta na porta não privilegiada 8080 e corre como utilizador não-root.
Requer Node 24 (a versão com que a imagem e o CI são construídos) e pnpm 11. A versão exata do pnpm é fixada pelo campo packageManager de package.json, por isso corepack enable é suficiente para o obter.
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 para HTML/JS simples: cada rota é pré-renderizada e não há runtime Node em produção.src/lib/pki/, sem importação 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 e sign.ts. Cada rota sob src/routes/ é uma fina camada de UI em torno delas.@peculiar/x509 v2 constrói os seus objetos através de tsyringe, que precisa de um polyfill de metadados Reflect do lado do consumidor, por isso @abraham/reflection é importado antes dele em cada módulo que usa a biblioteca.pkijs, cujo motor Web Crypto é registado uma vez em src/lib/pki/engine.ts.tests/pki/ (Vitest) e os testes de navegador em e2e/ (Playwright). Os fixtures são raízes públicas reais (ISRG Root X1/X2) mais uma cadeia EC e CSR geradas, veja scripts/generate-fixtures.mjs.<meta> com connect-src 'none'; o nginx adiciona frame-ancestors 'none', X-Frame-Options, X-Content-Type-Options, Referrer-Policy: no-referrer, uma Permissions-Policy restritiva e os cabeçalhos de isolamento cross-origin. A demonstração Vercel envia o mesmo conjunto de cabeçalhos (veja vercel.json).docker-compose.yml incluído adiciona um sistema de ficheiros raiz só de leitura, cap_drop: ALL, no-new-privileges e limites de recursos.trivy fs) como na imagem recém-construída, que também é rejeitada quando o seu SO base está em fim de vida, para que uma imagem vulnerável nunca seja publicada. As licenças são analisadas numa passagem separada e não bloqueante.Este projeto segue o Semantic Versioning e o Conventional Commits. As alterações notáveis são registadas em CHANGELOG.md. As regras de contribuição estão em CONTRIBUTING.md.
CHANGELOG.md, renomeie o cabeçalho ## [Unreleased] para a nova versão com a data de hoje, por exemplo ## [1.2.3] - 2026-06-01, adicione um novo ## [Unreleased] vazio acima dele, e atualize as referências de links no fundo do ficheiro."version" em package.json para o mesmo número.main (um commit convencional, por exemplo chore(release): 1.2.3) e faça push.git tag -a v1.2.3 -m "pki-toolbox v1.2.3"
git push origin v1.2.3
Lint, testes unitários e testes end-to-end correm em cada push. As fases de scan, build e release vêm dos componentes partilhados YouKyi-Infra/ci-infrastructure/ci-catalog (trivy-scan, docker-build, gitlab-release), fixados por versão em .gitlab-ci.yml.
Uma tag vX.Y.Z executa toda a cadeia: scan, build da imagem, scan da imagem, push de vX.Y.Z para o registo GitLab e para os espelhos públicos (ghcr.io, Docker Hub), depois uma GitLab Release cujas notas são a secção ## [X.Y.Z] correspondente extraída de CHANGELOG.md (uma secção vazia faz falhar a tarefa em vez de publicar notas vazias).
Um push para main executa o mesmo pipeline menos a fase de release, e a tarefa da imagem só corre quando um ficheiro que afeta a build mudou, para que um push apenas de docs ou config não reconstrua a imagem.
As dependências são mantidas atualizadas pelo Renovate, que estende o preset partilhado Renovate-Bot/renovate-config (veja renovate.json).