¿Qué envía exactamente ssh al realizar una negociación clave?

10

Al especificar explícitamente el archivo de identidad a ssh:

ssh -i ./id_rsa ...

Tengo estas líneas en el seguimiento de depuración ssh:

debug1: Offering public key: ./id_rsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply

¿Significa que ssh-Generated también id_rsacontiene un exponente público de RSA? id_rsael formato parece ser bastante explícito porque contiene una clave privada con su bloque "BEGIN PRIVATE KEY", por lo que "ofrecer clave pública" debe significar algo más que "enviar la clave pública al servidor".

EDITAR:

Para aclarar, quiero saber qué está sucediendo exactamente detrás de la línea de "oferta de clave pública". Si el cliente posee varias claves, todas se ofrecerán al servidor una por una.

Alex B
fuente
Para agregar a ese problema, hay un método para que el servidor verifique si obtuvimos una buena clave antes del desafío. Porque ya tenía un servidor que rechazó nuestra clave incluso antes de descifrarla. El error estaba allí debido a que el nombre no estaba bien especificado.
Gopoi

Respuestas:

12

Para conectarse a un servidor SSH y autenticarse con su par de claves pública / privada, primero debe compartir su clave pública con el servidor.

esto se hace mediante la copia de la clave pública para su clave privada al servidor, y su adición al ~/ssh/authorized_keysya sea por copiar / pegar, copiar id_rsa.puba ~/.ssh/authorized_keysen el servidor o con cat id_rsa.pub >> ~/.ssh/authorized_keys, añadiendo a la lista.

cuando se conecta, el servidor usa su clave pública para firmar un desafío, y su cliente usa su clave privada id_rsapara descifrar el desafío, volver a cifrarlo con el público del servidor host keyy enviarlo de vuelta.

el host verifica que descifró el desafío correctamente, descifrando su respuesta con su clave privada, y el cliente / host establece una conexión cifrada, basada en los datos compartidos, no en sus claves públicas / privadas.

en NINGÚN PUNTO en el intercambio está su clave privada, o la clave privada del host intercambiada o revelada entre sí. su clave pública se almacena en el servidor, pero es por eso que es una clave PÚBLICA.

cpbills
fuente
Sí, todo está bien, pero todo esto sucede antes de que el servidor identifique la clave pública para cifrar el desafío. Tengo varias claves y todas se "ofrecen" al servidor una por una. ¿Qué implica eso exactamente? Y sí, me doy cuenta de que la clave privada no se envía realmente, probablemente debería eliminar esa línea de la pregunta por completo. : P
Alex B
cuando especifica que ssh -i keynamele está diciendo a su cliente ssh exactamente QUÉ clave planea usar para conectarse al servidor. si tiene una docena de claves en ~/.ssh/su cliente NO iterará a través de cada clave. buscará ~/.ssh/id_rsa, ~/.ssh/id_dsapotencialmente algunos otros nombres de archivo que están codificados en el cliente, o qué clave se especifica para ese host en ~/.ssh/config... larga historia corta; su cliente no está / ofreciendo / ninguna clave para el servidor.
cpbills
cuando se conecta, su / cliente / descifra el desafío del servidor y luego cae en su lista de claves privadas locales estandarizadas para cifrar el desafío y enviar la respuesta. Si la respuesta de desafío falla, puede / puede / pasar al siguiente nombre clave codificado, volver a cifrar con / esa / clave privada e intentar nuevamente. nuevamente, sus claves, públicas y privadas no son / compartidas / con el servidor en la autenticación de inicio de sesión.
cpbills
1
oh, releí tu comentario; host: encripta el desafío con la clave de host, cliente: descifra el desafío con la clave de host del host, cliente: encripta el desafío con clave privada, host: intenta descifrar el desafío con todas las claves públicas enumeradas en ~/.ssh/authorized_keysel host sabe cuál es el desafío y qué está buscando porque, una vez que una clave pública la desbloquea, sabe usar esa clave.
cpbills
@cpbills, lo siento, olvidé mencionar que tengo algunas claves de un agente reenviado, por lo tanto, se ofrecen varias claves (-vvv log muestra todas las ofrecidas, aunque especifique el archivo de identidad).
Alex B
1

La criptografía de clave pública / privada se basa en un sistema muy simple:

Tiene una clave pública que es capaz de realizar un cifrado unidireccional, y una clave privada que es capaz de descifrar. La clave pública se puede dar a todos en el mundo, y nadie podrá descifrar sus datos cifrados, aunque sí podrán cifrar datos que puede descifrar con su clave privada.

Entonces la respuesta a su pregunta es: "Su clave pública".

Satanicpuppy
fuente
Sí, gracias, sé en detalle cómo funciona la criptografía de clave pública, pero quiero conocer los detalles del protocolo SSH y el formato de la clave. Estoy interesado en saber si almacena el exponente público en el archivo de clave privada o no. Por lo que sé, "ofrecer clave pública" también puede significar firmar un nonce con su clave privada, para que el servidor pueda encontrar una clave pública correspondiente.
Alex B
Si. lo hace ssh-keygen -y le dará la clave pública de la clave privada, lo contrario no funciona
Mâtt Frëëman
1

No creo que deba enviar la clave pública o privada en este momento. El cliente debe realizar una encriptación utilizando la clave privada en texto plano que el servidor ya conoce. El host puede descifrar este mensaje utilizando la clave pública, sabiendo que el único que podría haberlo cifrado correctamente es un cliente que posee la clave privada correspondiente, autenticando así al cliente.

Creo que lo dice Offering public key: ./id_rsaporque usa la clave privada (almacenada ./id_rsa) para realizar un cifrado en texto sin formato que es conocido por el servidor y luego el servidor usará la clave pública para descifrar este texto cifrado y confirmar que coincide con el texto sin formato. El ./id_rsa.pubcliente nunca debe necesitar el archivo de clave pública después de la generación de la clave inicial. Esto solo lo usa el servidor para el descifrado.

Trey Hunner
fuente
Sospechaba que algo así sucede, pero quería algunos detalles (es decir, el protocolo de negociación de clave SSH real). No estoy seguro de por qué te votaron negativamente.
Alex B
Perdón, mi respuesta fue tan inestable. No estoy familiarizado con los detalles de la negociación de claves SSH, solo las negociaciones generales necesarias en la autenticación de clave pública. Podría haber sido rechazado por la respuesta no específica.
Trey Hunner