Inspector de almacenes PKCS#12
Lee un almacén PKCS#12 como lo hace `openssl pkcs12 -info`, directamente desde los bytes y sin salir del navegador. La mitad del archivo se puede leer sin contraseña, y esa mitad se muestra primero: la versión del PFX, el resumen del MAC con su número de iteraciones y la longitud de la sal, y una fila por bloque de contenido que dice si está en claro o cifrado y con qué algoritmo — PBES2 con AES-256-CBC y PBKDF2-HMAC-SHA256 en todo lo que escribe OpenSSL 3, o pbeWithSHA1And40BitRC2-CBC en los archivos que Java 21 y OpenSSL moderno se niegan a cargar. Muchas veces esa fila es toda la respuesta que buscabas. Al escribir la contraseña se verifica el MAC, calculado con la derivación PKCS#12 del apéndice B del RFC 7292, que no es PBKDF2 y es el detalle que más reimplementaciones equivocan, y luego se descifran las bolsas: cada certificado con su sujeto, emisor, número de serie, periodo de validez, nombres alternativos, algoritmo de clave y huella SHA-256, ordenados de la hoja hacia arriba, junto al friendlyName y el localKeyID de cada bolsa. Después responde a la pregunta por la que se abre un almacén: ¿hay una clave privada y es la del certificado hoja? La parte pública se reconstruye a partir de la propia clave y se compara byte a byte con el SubjectPublicKeyInfo del certificado, así que el veredicto no es una suposición basada en un alias coincidente. Lo que no puede hacer es descifrar un archivo antiguo: WebCrypto no tiene RC2, RC4, DES ni Triple DES, de modo que esos almacenes se señalan como heredados en lugar de leerse a medias, aunque su MAC sí se verifica y por tanto sabrás si la contraseña es correcta. Tampoco valida la cadena contra ningún almacén de confianza.
Cómo usar
- Suelta el .p12 o .pfx sobre el recuadro. La estructura aparece de inmediato: no hace falta contraseña para ver el algoritmo del MAC, las iteraciones y el cifrado que protege cada bloque.
- Si estás depurando una importación fallida, empieza por la tabla de bloques. Una fila con pbeWithSHA1And40BitRC2-CBC o 3-KeyTripleDES indica un almacén heredado, y eso es lo que rechazan Java 21, OpenSSL 3 y Windows.
- Escribe la contraseña y pulsa Abrir. La línea del MAC dice de una vez si la contraseña es correcta y si el archivo se ha alterado desde que se escribió.
- Mira la etiqueta «Clave y certificado»: compara la clave pública reconstruida desde la clave privada con la del certificado hoja, que es la prueba real de si este almacén puede servir TLS.
- Lee los certificados en orden: primero la hoja y encima cada emisor. Que falte un intermedio aquí es justo lo que hace que un servidor funcione en un navegador que ya lo visitó y falle en el resto.
Preguntas frecuentes
- ¿Por qué veo los algoritmos y el MAC antes de escribir la contraseña?
- Porque nada de eso está cifrado. Un PFX es un número de versión, un authenticated safe y un bloque MacData; el safe es una lista de bloques de contenido, cada uno con SafeContents en claro o un EncryptedData de PKCS#7 cuyo AlgorithmIdentifier indica el cifrado, la sal y las iteraciones sin proteger. Solo el contenido de las bolsas está cifrado. Por eso un inspector puede decirte que el archivo es un almacén RC2 heredado, cuán bajo es su número de iteraciones y cuántos bloques tiene sin conocer la contraseña, y por eso no conviene tratar un .p12 como opaco solo porque lleve contraseña.
- Me dice que el almacén usa algoritmos heredados. ¿Qué hago?
- Conviértelo una vez con OpenSSL: `openssl pkcs12 -legacy -in old.p12 -nodes -out tmp.pem -passin pass:…` y después `openssl pkcs12 -export -in tmp.pem -out new.p12`, que en OpenSSL 3 escribe PBES2 con AES-256-CBC y PBKDF2-HMAC-SHA256 por omisión. Borra tmp.pem al terminar: contiene la clave privada sin cifrar. La opción -legacy existe porque OpenSSL 3 movió RC2, RC4 y DES simple al proveedor legacy y Java retiró los mismos algoritmos de su manejo de almacenes; un archivo escrito por un equipo de 2015 no está corrupto, solo está cifrado con primitivas que ya nadie habilita.
- ¿La contraseña del MAC y la del cifrado son la misma?
- En teoría pueden ser dos: el RFC 7292 permite una contraseña para la integridad y otra para el cifrado, y algunas herramientas corporativas lo hacen. En la práctica todos los exportadores habituales usan la misma cadena, y por eso un MAC que falla casi siempre significa contraseña equivocada y no archivo manipulado. Además derivan la clave de forma distinta: la del MAC sale de la derivación PKCS#12 del apéndice B con ID 3, y el cifrado moderno de las bolsas usa PBKDF2 sobre los bytes de la contraseña. Así que un almacén escrito de verdad con dos contraseñas puede verificar el MAC y aun así no descifrarse.
- Mi .p12 se abre pero no tiene clave privada. ¿Dónde está?
- Lo más probable es que nunca se exportara. `openssl pkcs12 -export -nokeys` y casi todos los botones de «exportar la cadena de certificados» de un navegador o de una consola MMC escriben un almacén solo con certBags, que es un PFX perfectamente válido. Es el archivo que aparece en el peor momento, porque un servidor web o un balanceador lo importan sin quejarse y luego fallan el handshake TLS con un error de clave que no coincide. Aquí la lista de bolsas muestra exactamente cuáles hay, así que un almacén sin bolsa de clave se detecta antes de desplegarlo.
- ¿Para qué sirve el ID local de clave?
- localKeyID es el atributo que empareja una bolsa de certificado con una de clave, porque un almacén puede contener varias de cada tipo. OpenSSL usa el hash SHA-1 de la clave pública del certificado, Windows y Java usan sus propios valores y el formato no exige ningún esquema concreto. friendlyName es el alias humano: lo que lista keytool y lo que muestra el almacén de certificados de Windows, y al importar un almacén cuyo friendlyName choca con un alias existente aparece el clásico error «alias already exists». Aquí se muestran ambos por bolsa, junto con el bloque del que salió cada una.
- ¿Es seguro abrir en una página web un almacén con clave privada?
- Esta página no envía el archivo ni la contraseña a ninguna parte: el análisis, la comprobación del MAC, PBKDF2, el descifrado AES-CBC y la comparación entre clave y certificado se ejecutan en tu pestaña mediante WebCrypto, y la contraseña vive solo en el estado del componente hasta que la cierras. En localStorage únicamente queda el nombre del archivo. Dicho esto, con un almacén de producción lo más prudente es revisarlo con un `openssl pkcs12 -info` sin conexión; usa esto para los almacenes que estás depurando y desconfía de cualquier herramienta web que te pida subir un .p12.
Herramientas relacionadas
Decodificador de CSR (PKCS#10)
Lee una solicitud de firma de certificado antes de enviarla: sujeto, SANs, tamaño de clave, algoritmo de firma y si su autofirma verifica.
Validador de JSON Schema
Comprueba un documento JSON contra un JSON Schema en el navegador: cada error trae su JSON Pointer, la línea donde cae y la palabra clave que falló.
Decodificador de CRL (X.509)
Lee una lista de revocación en tu navegador: emisor, número de CRL, ventana de validez, cada serie revocada con su motivo y la firma.
Generador Aleatorio de IP y MAC
Genera lotes de IPv4, IPv6 o MAC aleatorias para tests y mocks — scopes public / private / ULA / link-local / UAA / LAA soportados.
Bcrypt — Hash y Verificación
Genera hashes bcrypt con factor de coste ajustable, o verifica un hash existente contra una contraseña — todo en tu navegador.
Inspector de claves públicas PGP
Lee una clave pública OpenPGP en armadura: huella completa, ID de clave, algoritmo, tamaño, fechas de creación y caducidad, IDs de usuario y subclaves.