SSH "no matching key exchange method found" o "no matching host key type found": cómo solucionarlo

El servidor solo ofrece algoritmos antiguos que tu cliente OpenSSH ya no activa por defecto. Para llegar a ese host concreto, añade el algoritmo de Their offer con un + en su bloque Host, por ejemplo KexAlgorithms +diffie-hellman-group14-sha1. Esto debilita solo esa conexión. La solución real es actualizar el dispositivo o su configuración SSH.

Actualizada el . Cada error y cada opción con + se reprodujo con OpenSSH 10.3 en macOS contra un servidor OpenSSH 10.0 desechable en Debian 13, configurado para ofrecer solo el algoritmo antiguo.

Los mensajes

Unable to negotiate with 203.0.113.10 port 22: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,ext-info-s,kex-strict-s-v00@openssh.com
Unable to negotiate with 203.0.113.10 port 22: no matching host key type found. Their offer: ssh-rsa
Unable to negotiate with 203.0.113.10 port 22: no matching cipher found. Their offer: aes128-cbc
Unable to negotiate with 203.0.113.10 port 22: no matching MAC found. Their offer: hmac-md5

Antes de iniciar sesión, cliente y servidor deben acordar una lista de algoritmos. Este mensaje significa que no tienen nada en común, y Their offer te dice lo que el servidor puede hacer. OpenSSH sigue incluyendo muchos algoritmos antiguos, pero no los usa salvo que lo pidas. Pasa a menudo con equipos de red antiguos, impresoras, cajas de almacenamiento y sistemas Linux viejos, muchas veces justo después de actualizar tu cliente.

Nombres como ext-info-s y kex-strict-s-v00@openssh.com en la oferta son marcadores del protocolo, no algoritmos que puedas elegir. Ignóralos.

Permitirlo para un solo host

Cada mensaje corresponde a una opción:

MensajeOpción
no matching key exchange method foundKexAlgorithms
no matching host key type foundHostKeyAlgorithms
no matching cipher foundCiphers
no matching MAC foundMACs

Pruébalo una vez en la línea de comandos, copiando el nombre de la oferta:

ssh -o KexAlgorithms=+diffie-hellman-group14-sha1 user@203.0.113.10

Un dispositivo antiguo suele necesitar varias, y aparecen de una en una, porque el cliente se detiene en la primera discrepancia. Añade cada una a ~/.ssh/config:

Host old-switch
    HostName 203.0.113.10
    User user
    KexAlgorithms +diffie-hellman-group14-sha1
    HostKeyAlgorithms +ssh-rsa
    Ciphers +aes128-cbc

Conserva el +. Añade a la lista por defecto, de modo que los algoritmos modernos siguen primero y se usan en cuanto el dispositivo los admite. Sin él, sustituyes la lista entera.

Déjalo en un bloque Host con nombre y nunca bajo Host *, que bajaría el listón para todos los servidores. Además, ssh usa el primer valor que encuentra para cada opción, así que pon este bloque por encima de cualquier bloque general que fije la misma opción.

Tu clave RSA se rechaza sin explicación

Si un servidor antiguo solo entiende firmas ssh-rsa para las claves de usuario, el cliente se limita a decir Permission denied (publickey), sin mencionar algoritmos. Nos pasó con un servidor limitado a ssh-rsa. Lo arregló añadir esta línea para el host:

PubkeyAcceptedAlgorithms +ssh-rsa

ssh-dss no tiene alternativa

OpenSSH 10.0 eliminó DSA por completo. A un cliente de la versión 10 no se le puede decir que lo use:

command-line line 0: Bad key types '+ssh-dss'.

Si un dispositivo ofrece solo ssh-dss, actualiza el dispositivo. Hasta entonces, la única forma de entrar es un cliente más antiguo, por ejemplo en una máquina virtual dentro de una red de confianza.

Ver qué admite cada lado

Lo que tu cliente puede hacer en total, incluido lo que no activa por defecto:

ssh -Q kex
ssh -Q HostKeyAlgorithms
ssh -Q cipher
ssh -Q mac

Lo que tu cliente ofrecería realmente a este host:

ssh -G server | grep -E '^(kexalgorithms|hostkeyalgorithms|ciphers|macs) '

Todo lo que ofrece el servidor, de una vez en lugar de un error cada vez:

ssh -vv user@server 2>&1 | grep -A9 'peer server KEXINIT'

Lo que estás aceptando

Estos algoritmos están desactivados por una razón. La debilidad afecta solo a esa conexión:

  • diffie-hellman-group1-sha1 usa un grupo de 1024 bits y SHA-1.
  • ssh-rsa firma con SHA-1. OpenSSH lo desactivó por defecto en la versión 8.8. El problema no es la clave RSA en sí: un servidor moderno usa la misma clave con rsa-sha2-256 o rsa-sha2-512. Para el mismo problema con las claves de usuario, mira no mutual signature supported.
  • Los cifrados CBC y hmac-md5 son diseños antiguos que los modos más nuevos sustituyeron.

Trátalo como algo temporal, y mantén un dispositivo así en una red de gestión y lejos de internet abierto.

La solución real en el dispositivo

  1. Actualízalo. Las actualizaciones de firmware suelen añadir algoritmos modernos. Consulta la documentación del fabricante sobre SSH o el refuerzo de la gestión.
  2. Revisa sus ajustes. Muchos dispositivos admiten mejores algoritmos que simplemente están desactivados. En un servidor Linux, esto muestra lo que está activo:
    sudo sshd -T | grep -iE '^(kexalgorithms|hostkeyalgorithms|ciphers|macs) '
    Elimina las líneas antiguas de KexAlgorithms, HostKeyAlgorithms, Ciphers o MACs de /etc/ssh/sshd_config y de su carpeta de includes para volver a los valores por defecto.
  3. Genera una clave de host moderna si el servidor no tiene ninguna:
    sudo ssh-keygen -t ed25519 -N '' -f /etc/ssh/ssh_host_ed25519_key
    sudo systemctl restart sshd
    La unidad se llama ssh en Debian y Ubuntu. Los clientes pueden entonces mostrar un aviso de clave de host cambiada, así que cuenta con ello.
  4. Quita el apaño de tu configuración y vuelve a conectar para confirmarlo.

Un aviso relacionado, no un error

Desde OpenSSH 10.1, una conexión que funciona pero usa un intercambio de claves más antiguo imprime esto:

** WARNING: connection is not using a post-quantum key exchange algorithm.
** This session may be vulnerable to "store now, decrypt later" attacks.
** The server may need to be upgraded. See https://openssh.com/pq.html

La sesión sí se conecta, y la solución está en el servidor. Qué significa y cómo solucionarlo o silenciarlo: el aviso sobre el intercambio de claves poscuántico.

Preguntas

¿Es seguro activar diffie-hellman-group14-sha1?

Solo como solución temporal para un equipo antiguo en una red de confianza. Depende de SHA-1, así que déjalo en el bloque Host de ese host y nunca bajo Host *.

¿Por qué empezó después de una actualización?

Los clientes OpenSSH recientes dejan de ofrecer por defecto los algoritmos antiguos. El servidor no cambió: es tu cliente el que ya no acepta lo que ofrece.

¿Qué significa el + delante de un algoritmo?

Añade el algoritmo a la lista predeterminada en lugar de sustituirla, así los modernos siguen primero y se usan en cuanto el equipo los admite.

Fuentes

Más en Mensajes de error

Todas las guías