Generando un par de claves privadas+públicas para SSH: ¿diferencia entre ssh-keygen y openssl?

Generando un par de claves privadas+públicas para SSH: ¿diferencia entre ssh-keygen y openssl?

Quiero crear pares de claves públicas y privadas para usarlas en la autenticación SSH.

No puedo entender la diferencia entre esto:

openssl genrsa -out MyPrivateKey 4096
openssl rsa -in MyPrivateKey -pubout -out MyPublicKey

que primero crea una clave RSA privada y luego deriva la clave pública de ella, o:

ssh-keygen -b 4096 -t rsa -f MyFancyKey

que crea una clave RSA privada en el archivo 'MyFancyKey' y la clave pública correspondiente en 'MyFancyKey.pub'.

La estructura de las claves privadas parece algo similar, aunque la creada opensslcomienza con:
-----BEGIN RSA PRIVATE KEY-----

Y el de ssh-keygencomienza con:
-----BEGIN OPENSSH PRIVATE KEY-----

¿Existe una diferencia fundamental entre estos dos tipos de claves?


Luego las claves públicas correspondientes, la de opensslcontiene:

-----BEGIN PUBLIC KEY-----
  ...base64 encoded...
-----BEGIN PUBLIC KEY-----

Mientras que el de ssh-keygensolo contiene una línea:
ssh-rsa XXXXXX...base64 encoded...XXXXX [email protected]

¿Son esencialmente el mismo tipo de datos pero con un formato diferente? ¿O son realmente incompatibles?

Estoy tratando de entender completamente cómo funciona todo esto en relación con SSH. Por ejemplo, ¿por qué mi nombre de usuario, el nombre de mi computadora y el nombre de mi red local están en esa clave? ¿No se supone que normalmente se usa para acceder a SSH enotro¿ordenadores? Con mi nombre de usuario en esa computadora, no el mío.

Respuesta1

claves privadas

¿Existe una diferencia fundamental entre estos dos tipos de claves?

No, son esencialmente los mismos datos.

  • BEGIN RSA PRIVATE KEYindica el formato de clave "PKCS#1" o "PEM", que es la codificación Base64 de una estructura serializada ASN.1 DER. Es una secuencia ASN.1 básica que contiene los parámetros RSA (norte,mi,d,pag,q, etc).

    Este formato proviene del esfuerzo de seguridad del correo electrónico PEM que luego se convirtió en S/MIME (de ahí el uso de ASN.1 DER) y se usaba comúnmente para SSL/TLS, así como para RSA genérico varios.

    Durante mucho tiempo, también fue el formato de clave principal de OpenSSH (debido a que OpenSSH ya usa el código criptográfico de OpenSSL, las funciones "cargar clave" y "escribir clave" también estaban convenientemente disponibles). Esto significa que puede utilizar ssh-keygen -m PEMpara generar o convertir dichas claves.

  • BEGIN PRIVATE KEYindica el formato de clave "PKCS#8" (sin cifrar); Su contenido es muy similar al formato PEM, con los mismos parámetros RSA anidados dentro de otra estructura que indica que efectivamente es una clave RSA.

    PKCS#8 está pensado específicamente como el reemplazo más moderno del formato PEM. En comparación con PEM, el formato PKCS#8 separa más claramente la "carga útil" (algoritmo de clave, cifrado) del envoltorio Base64 externo: todos los metadatos ahora están dentro de la estructura, por lo que es más fácil actualizarlos para nuevos tipos de claves. El nuevo formato también admite mejores cifrados y KDF para claves cifradas.

    OpenSSH también reconocerá este formato (debido a su uso de OpenSSL para la carga de claves) y creo que las versiones recientes también pueden crearlo.

  • BEGIN OPENSSH PRIVATE KEYes un formato inventado por OpenSSH para OpenSSH y, a diferencia de los formatos PEM/PKCS, utiliza serialización de paquetes SSHv2 para sus estructuras de datos (no más DER o ASN.1).

    Una razón por la que OpenSSH ahora usa este formato para evitar depender completamente de OpenSSL y/o para poder agregar nuevos algoritmos de claves sin esperar a que OpenSSL implemente la carga/guardado de esas claves, lo que también significa esperar a que PKIX estandarice el formato. ASN.1 OID y estructura para cada nuevo algoritmo (que de otro modo no tiene absolutamente nada que ver con SSH).

    Por ejemplo, a OpenSSL le tomó un tiempo obtener soporte completo para Ed25519, tiempo durante el cual OpenSSH no pudo usar libcrypto de OpenSSL para las matemáticas reales, ni para cargar/guardar archivos de claves Ed25519; eso es lo que impulsó la creación de este formato.

    Otra ventaja del formato OpenSSH es que las claves cifradas con contraseña utilizan bcrypt para la derivación de la clave de cifrado; en ese momento, el formato PEM estaba limitado a un KDF muy débil (es decir, fácil de aplicar fuerza bruta), e incluso PKCS#8 solo admite el PKBDF2, ligeramente inferior.

  • PuTTY tiene su propio .ppkformato, que se basa principalmente en texto.

    Su supuesta ventaja es que no necesita un archivo .pub separado porque solo cifra los parámetros privados de forma selectiva, mientras que tanto el formato PKCS anterior como el formato OpenSSH posterior cifran todo o nada, por lo que necesitan el archivo .pub para poder podría ofrecerle la clave antes de pedirle la contraseña para desbloquearla.

    Puede utilizar /usr/bin/puttygenpara convertir entre todos estos formatos.

  • El software Java puede usar el formato PKCS#12 (PFX) debido a que es el formato nativo de "almacén de claves Java", y algunos programas pueden incluso usar el formato supuestamente estándar SSH.COM.

Ver también:¿Formato de archivo de clave pública OpenSSH?

Claves públicas

¿Son esencialmente el mismo tipo de datos pero con un formato diferente?

Sí, son esencialmente los mismos datos.

  • BEGIN PUBLIC KEYCreo que también es PKCS#8, por lo que dentro de Base64 hay una estructura ASN.1 serializada por DER que la identifica como una clave RSA, seguida de parámetros clave (norte,mi).

  • El formato de una línea es parcialmente específico de OpenSSH, aunque los datos centrales codificados en Base64 están exactamente en el mismo formato que se utiliza dentro del protocolo SSHv2 ("on the wire"). Como puede imaginar, los datos codificados utilizan la serialización de paquetes SSHv2, pero aún contienen el mismo RSA.norteymivalores.

Ver también:¿Formato de archivo de clave pública OpenSSH?

Por ejemplo, ¿por qué mi nombre de usuario, el nombre de mi computadora y el nombre de mi red local están en esa clave?

es un comentariopara ayudarle a distinguir esta clave pública de otras claves públicas cuando tiene un authorized_keysarchivo largo.

información relacionada