Los formularios comunes son PKCS # 12 / PFX (un par de claves cifradas, posiblemente con certificados adicionales) y PEM o DER forme PKCS # 1 como lo usan OpenSSL y OpenSSH (eso es lo que id_rsa
será). PEM es una versión base64 del formulario binario DER (ASN.1) con encabezado / pie de página de identificación, no es una forma distinta, excepto que permite el cifrado en la medida en que PKCS # 1 DER no.
Si la clave está cifrada (solo en forma PEM), contendrá líneas de encabezado adicionales para indicar el cifrado y IV, por ejemplo:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,AA171F6005B3DD31
...
PKCS # 1 es solo RSA, PKCS # 8 es un "contenedor" de propósito más general para las claves, también es ASN.1 pero indica explícitamente el tipo de datos dentro, por ejemplo, (ver offset 9, línea 4):
$ openssl pkcs8 -inform PEM -in ~/.ssh/id_rsa -topk8 -nocrypt \
-outform DER -out id_rsa.p8
$ dumpasn1 -tilda id_rsa.p8
0 1213: SEQUENCE {
4 1: . INTEGER 0
7 13: . SEQUENCE {
9 9: . . OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1)
: . . . (PKCS #1)
20 0: . . NULL
: . . }
22 1191: . OCTET STRING, encapsulates {
26 1187: . . SEQUENCE {
30 1: . . . INTEGER 0
33 257: . . . INTEGER
: . . . . 00 B1 1F 09 61 C1 A1 09 ....a...
...
(Estoy usando dumpasn1
aquí en lugar de openssl asn1parse
, vergonzosamente, este último no puede analizar la salida pkcs8
correctamente).
OpenSSH no admite (AFAIK) PKCS # 8 que no sea para importar / exportar, tienen su formato propio . Ese formato se usa solo para los tipos de clave más nuevos (Ed25519), pero se planea que sea el predeterminado en el futuro.
Hay algunas cosas que puedes verificar útilmente:
- identificar la línea de encabezado / pie de página en PEM y la validez de codificación de base64
- formato ASN.1 válido (principalmente limitado a las verificaciones de tipo y longitud)
- integridad numérica de los parámetros RSA
También puede rumiar en valor del exponente público (demasiado grande puede causar problemas de interoperabilidad, demasiado pequeño está implicado con problemas de seguridad para algunas aplicaciones).
El comando openssl rsa ... -check
comprueba 1 (solo PEM) y 2 implícitamente, y 3 explícitamente. Consulte la documentación de la API de OpenSSL RSA_check_key()
para obtener detalles de las comprobaciones. Eso debería ser suficiente para la mayoría, creo.
Un archivo de clave privada RSA (casi siempre) contiene más que solo el exponente de clave privada, también contiene los parámetros de clave pública y algunos valores intermedios para la optimización (a través de CRT ), estos valores pueden verificarse para determinar su consistencia o primacía. El "tamaño de la clave" es la longitud del '' módulo '', con la advertencia de que (normalmente) habrá un 00 bytes iniciales para garantizar que se interpreta como un entero positivo (problema con la firma del ASN.1).
Para una vista diferente, también puedes hacer:
openssl asn1parse -inform PEM -in ~/.ssh/id_rsa
(pero eso no comprueba los parámetros RSA)