RFC 4252 proporciona pautas sobre cómo debería funcionar la autenticación de clave pública, pero no es completamente específica en el orden exacto de el intercambio. Dicho esto, en los comentarios se indicó que OP no está interesado en RFC sino en los detalles de implementación de "SSH en Linux", que se refiere a OpenSSH en la mayoría de los casos.
Al conectarse a un host remoto a través de SSH con el distintivo -v
, normalmente verá lo siguiente para cada clave:
debug1: Offering RSA public key: .ssh/id_rsa.pub
Además, podemos consultar el código fuente . Después de un vistazo rápido, lo siguiente es relevante:
if (PRIVSEP(user_key_allowed(ssh, pw, key, 1, &authopts)) &&
PRIVSEP(sshkey_verify(key, sig, slen, sshbuf_ptr(b),
sshbuf_len(b), NULL, ssh->compat)) == 0) {
authenticated = 1;
}
La función user_key_allowed
verifica la clave en un archivo de claves autorizado, mientras que sshkey_verify
aparece para verificar la firma de algún búfer.
Combinando esta información, parece que el cliente usará todas sus claves hasta que el servidor acepte una. Esto también es evidente por el hecho de que tener varias claves presentes durante un solo intento de conexión puede aparecer en el servidor como múltiples intentos de autenticación, ya que se intentaron todas las claves.
Además, vea los comentarios de @nbering para obtener detalles sobre los desafíos / firmas.
Editar: aquí hay un ejemplo en el que tengo varias claves, y el servidor solo acepta la tercera. Utilizando -vvv
:
debug1: Next authentication method: publickey
debug1: Offering public key: RSA SHA256:QfriqWH2S2uD6wHbxTFSudppOcJ51bB5ABr8ICrUhL8 .ssh/id_rsa2
debug3: send_pubkey_test
debug3: send packet: type 50 # SSH_MSG_USERAUTH_REQUEST
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 51 # SSH_MSG_USERAUTH_FAILURE
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Offering public key: RSA SHA256:3M8bnhs+jGJm8X2cgnWzzMrfoeT3WmDkSp8AEr751Sk user@laptop
debug3: send_pubkey_test
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Offering public key: RSA SHA256:CQeP9lcYBVqV11Rn8Ca4Sv+W8l8uU63WQ4TpyG5ZMmI user@laptop
debug3: send_pubkey_test
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 60 # SSH_MSG_USERAUTH_PK_OK
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug2: input_userauth_pk_ok: fp SHA256:CQeP9lcYBVqV11Rn8Ca4Sv+W8l8uU63WQ4TpyG5ZMmI
debug3: sign_and_send_pubkey: RSA SHA256:CQeP9lcYBVqV11Rn8Ca4Sv+W8l8uU63WQ4TpyG5ZMmI
debug3: send packet: type 50
debug3: receive packet: type 52 # SSH_MSG_USERAUTH_SUCCESS
debug1: Authentication succeeded (publickey).
De nuevo, esto sigue muy de cerca a RFC 4252 , páginas 8-9.