Inspetor de keystore PKCS#12
Lê um keystore PKCS#12 como o `openssl pkcs12 -info` faz, direto dos bytes e inteiramente dentro do navegador. Metade do arquivo é legível sem senha nenhuma, e é essa metade que aparece primeiro: a versão do PFX, o digest do MAC com o número de iterações e o tamanho do sal, e uma linha por bloco de conteúdo dizendo se ele está em claro ou cifrado e com qual algoritmo — PBES2 com AES-256-CBC e PBKDF2-HMAC-SHA256 em tudo que o OpenSSL 3 escreve, ou pbeWithSHA1And40BitRC2-CBC nos arquivos que o Java 21 e o OpenSSL atual se recusam a carregar. Muitas vezes essa linha já é a resposta inteira. Com a senha, o MAC é verificado usando a derivação PKCS#12 do apêndice B da RFC 7292 — que não é PBKDF2 e é o detalhe que a maioria das reimplementações erra — e os sacos são decifrados: cada certificado com titular, emissor, número de série, período de validade, nomes alternativos, algoritmo da chave e impressão SHA-256, na ordem da folha até a raiz, junto do friendlyName e do localKeyID de cada saco. Em seguida ele responde à pergunta que costuma motivar a abertura de um keystore: existe uma chave privada aqui e ela é a chave do certificado folha? A metade pública é reconstruída a partir da própria chave e comparada byte a byte com o SubjectPublicKeyInfo do certificado, então o veredito não é um palpite baseado em um alias igual. O que ele não faz é decifrar um arquivo antigo: o WebCrypto não tem RC2, RC4, DES nem Triple DES, então esses keystores são identificados como legados em vez de lidos pela metade — o MAC deles ainda é verificado, então dá para saber se a senha está certa. Também não valida a cadeia contra nenhum repositório de confiança.
Como usar
- Solte o .p12 ou .pfx na caixa. A estrutura aparece na hora: não é preciso senha para ver o algoritmo do MAC, as iterações e a cifra que protege cada bloco.
- Se você está investigando uma importação que falhou, comece pela tabela de blocos. Uma linha com pbeWithSHA1And40BitRC2-CBC ou 3-KeyTripleDES indica keystore legado, e é isso que Java 21, OpenSSL 3 e Windows estão recusando.
- Digite a senha e clique em Abrir. A linha do MAC diz de uma vez se a senha está certa e se o arquivo foi alterado depois de gravado.
- Olhe a etiqueta «Chave e certificado»: ela compara a chave pública reconstruída a partir da chave privada com a do certificado folha, que é o teste real de o keystore poder servir TLS.
- Leia os certificados na ordem: primeiro a folha, acima dela cada emissor. Faltar um intermediário aqui é exatamente o que faz um servidor funcionar num navegador que já o visitou e falhar em todos os outros.
Perguntas frequentes
- Por que vejo os algoritmos e o MAC antes de digitar a senha?
- Porque nada disso é cifrado. Um PFX é um número de versão, um authenticated safe e um bloco MacData; o safe é uma lista de blocos de conteúdo, cada um com SafeContents em claro ou um EncryptedData do PKCS#7 cujo AlgorithmIdentifier traz a cifra, o sal e as iterações abertamente. Só o conteúdo dos sacos é protegido. É por isso que um inspetor consegue dizer que o arquivo é um keystore RC2 legado, quão fraco é o número de iterações e quantos blocos ele tem sem saber a senha — e por isso não vale tratar um .p12 como opaco só porque ele tem senha.
- Ele diz que meu keystore usa algoritmos legados. O que eu faço?
- Converta uma vez com o OpenSSL: `openssl pkcs12 -legacy -in old.p12 -nodes -out tmp.pem -passin pass:…` e depois `openssl pkcs12 -export -in tmp.pem -out new.p12`, que no OpenSSL 3 grava PBES2 com AES-256-CBC e PBKDF2-HMAC-SHA256 por padrão. Apague o tmp.pem em seguida: ele guarda a chave privada sem cifra. A opção -legacy existe porque o OpenSSL 3 moveu RC2, RC4 e DES simples para o provedor legacy e o Java tirou os mesmos algoritmos do tratamento padrão de keystores; um arquivo escrito por um appliance de 2015 não está corrompido, apenas cifrado com primitivas que ninguém habilita mais.
- A senha do MAC e a da cifragem são a mesma?
- Em princípio podem ser duas: a RFC 7292 permite uma senha para a integridade e outra para a confidencialidade, e algumas ferramentas corporativas fazem isso. Na prática todos os exportadores comuns usam a mesma string, e por isso um MAC que falha quase sempre significa senha errada, não arquivo adulterado. As derivações também são diferentes: a chave do MAC vem da derivação PKCS#12 do apêndice B com ID 3, enquanto a cifragem moderna dos sacos usa PBKDF2 sobre os bytes da senha. Assim, um keystore realmente gravado com duas senhas pode passar no MAC e ainda assim não decifrar.
- Meu .p12 abre, mas não tem chave privada. Para onde ela foi?
- Provavelmente nunca foi exportada. O `openssl pkcs12 -export -nokeys` e quase todos os botões de «exportar a cadeia de certificados» de um navegador ou de um console MMC gravam um keystore só de certificados, com apenas certBags dentro — um PFX perfeitamente válido. É o arquivo que aparece na pior hora, porque um servidor web ou um balanceador importa sem reclamar e depois falha o handshake TLS com erro de chave que não confere. Aqui a lista de sacos mostra exatamente quais existem, então um keystore sem saco de chave é visível antes do deploy.
- Para que serve o ID local da chave?
- O localKeyID é o atributo que emparelha um saco de certificado com um saco de chave, já que um keystore pode conter vários de cada. O OpenSSL usa o hash SHA-1 da chave pública do certificado, Windows e Java usam valores próprios e o formato não exige esquema nenhum. O friendlyName é o apelido humano: o que o keytool lista e o que o repositório de certificados do Windows exibe, e importar um keystore cujo friendlyName colide com um alias existente é a causa comum do erro «alias already exists». Os dois aparecem por saco aqui, junto do bloco de onde cada um veio.
- É seguro abrir num site um keystore que contém chave privada?
- Esta página não envia o arquivo nem a senha a lugar nenhum: a análise, a verificação do MAC, o PBKDF2, a decifragem AES-CBC e a comparação entre chave e certificado rodam na sua aba via WebCrypto, e a senha fica apenas no estado do componente até você fechá-la. No localStorage sobra só o nome do arquivo. Ainda assim, com um keystore de produção o hábito mais seguro é conferir com um `openssl pkcs12 -info` offline; use isto para os keystores que você está depurando e desconfie de qualquer ferramenta web que peça o upload de um .p12.
Ferramentas relacionadas
Decodificador de CSR (PKCS#10)
Leia uma requisição de assinatura de certificado antes de enviá-la: sujeito, SANs, tamanho da chave, algoritmo de assinatura e se a autoassinatura verifica.
Validador de JSON Schema
Verifique um documento JSON contra um JSON Schema no navegador: cada erro traz o JSON Pointer, a linha onde cai e a palavra-chave que falhou.
Decodificador de CRL (X.509)
Leia uma lista de revogação no navegador: emissor, número da CRL, janela de validade, cada série revogada com seu motivo e a assinatura.
Gerador Aleatório de IP e MAC
Gera lotes de IPv4, IPv6 ou MAC aleatórios pra testes e mocks — escopos public / private / ULA / link-local / UAA / LAA suportados.
Bcrypt — Hash e Verificação
Gere hashes bcrypt com fator de custo ajustável, ou verifique um hash existente contra uma senha — tudo no navegador.
Inspetor de chaves públicas PGP
Leia uma chave pública OpenPGP em armadura: impressão digital completa, ID da chave, algoritmo, tamanho, datas de criação e expiração e subchaves.