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:
| Mensaje | Opción |
|---|---|
no matching key exchange method found | KexAlgorithms |
no matching host key type found | HostKeyAlgorithms |
no matching cipher found | Ciphers |
no matching MAC found | MACs |
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-sha1usa un grupo de 1024 bits y SHA-1.ssh-rsafirma 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 conrsa-sha2-256orsa-sha2-512. Para el mismo problema con las claves de usuario, mira no mutual signature supported.- Los cifrados CBC y
hmac-md5son 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
- 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.
- Revisa sus ajustes. Muchos dispositivos admiten mejores algoritmos que simplemente están desactivados. En un servidor Linux, esto muestra lo que está activo:
Elimina las líneas antiguas desudo sshd -T | grep -iE '^(kexalgorithms|hostkeyalgorithms|ciphers|macs) 'KexAlgorithms,HostKeyAlgorithms,CiphersoMACsde/etc/ssh/sshd_configy de su carpeta de includes para volver a los valores por defecto. - Genera una clave de host moderna si el servidor no tiene ninguna:
La unidad se llamasudo ssh-keygen -t ed25519 -N '' -f /etc/ssh/ssh_host_ed25519_key sudo systemctl restart sshdsshen Debian y Ubuntu. Los clientes pueden entonces mostrar un aviso de clave de host cambiada, así que cuenta con ello. - 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
- OpenSSH: opciones heredadas (legacy)
- ssh_config(5), manual de OpenBSD
- Notas de la versión OpenSSH 8.8: ssh-rsa desactivado por defecto
- Notas de la versión OpenSSH 10.0: DSA eliminado
- OpenSSH: criptografía poscuántica