En corto

1
ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa admin@legacy-host

Para que sea permanente, un bloque en ~/.ssh/config solo para ese host:

1
2
3
Host legacy-host
    HostKeyAlgorithms +ssh-rsa
    PubkeyAcceptedAlgorithms +ssh-rsa

Si la oferta es ssh-dss, la opción es +ssh-dss, pero solo funciona en OpenSSH anterior a 10.0. Desde 10.0 (abril de 2025) DSA no existe en el cliente y +ssh-dss falla con Bad key types; toca usar un cliente viejo (más abajo).

Qué significa el error

1
Unable to negotiate with 192.168.1.10 port 22: no matching host key type found. Their offer: ssh-rsa

El servidor solo sabe firmar su host key con ssh-rsa, que es RSA con SHA-1. OpenSSH 8.8 (septiembre de 2021) dejó de aceptar firmas RSA/SHA-1 por defecto porque SHA-1 está roto: según las notas de la versión, una colisión de prefijo elegido cuesta menos de 50 000 USD. Tu llave y el host key pueden seguir siendo RSA; lo que se rechaza es la firma con SHA-1. Un servidor moderno firma con rsa-sha2-256 o rsa-sha2-512 y no provoca este error.

Quién sigue ofreciendo solo ssh-rsa (o ssh-dss): HP iLO 2/3/4, switches y routers con firmware viejo, NAS sin actualizar, Dropbear antiguo en equipos embebidos, Windows Server 2003 con un SSH server de terceros, appliances fuera de soporte.

Variantes del mismo problema

MensajeOpción
no matching host key type found. Their offer: ssh-rsa-o HostKeyAlgorithms=+ssh-rsa
no matching host key type found. Their offer: ssh-dss-o HostKeyAlgorithms=+ssh-dss (OpenSSH < 10.0)
sign_and_send_pubkey: no mutual signature algorithm-o PubkeyAcceptedAlgorithms=+ssh-rsa
no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group1-sha1-o KexAlgorithms=+diffie-hellman-group14-sha1 (o +diffie-hellman-group1-sha1)
no matching cipher found. Their offer: aes256-cbc,aes128-cbc,3des-cbc-c aes256-cbc (equivale a -o Ciphers=+aes256-cbc)

no mutual signature algorithm es el mismo problema visto desde tu llave: el servidor solo acepta firmas ssh-rsa para autenticar tu llave RSA. En OpenSSH anterior a 8.5 la opción se llamaba PubkeyAcceptedKeyTypes; el nombre viejo sigue aceptándose como alias.

Un iLO 2 o 3 suele necesitar todo a la vez:

1
2
3
4
5
ssh -o HostKeyAlgorithms=+ssh-rsa \
    -o PubkeyAcceptedAlgorithms=+ssh-rsa \
    -o KexAlgorithms=+diffie-hellman-group14-sha1 \
    -c aes256-cbc \
    Administrator@ilo01

Config persistente

1
2
3
4
5
6
7
8
# ~/.ssh/config
Host ilo01
    HostName ilo01.lab.example
    User Administrator
    HostKeyAlgorithms +ssh-rsa
    PubkeyAcceptedAlgorithms +ssh-rsa
    KexAlgorithms +diffie-hellman-group14-sha1
    Ciphers +aes256-cbc

Tres detalles:

  • El + agrega al final de la lista por defecto. Sin + reemplazas la lista completa y ese host solo negociará lo que escribiste.
  • Nunca lo pongas bajo Host *: reactivarías SHA-1 contra todos tus servidores.
  • Si el host ya estaba en known_hosts con otro tipo de llave: ssh-keygen -R legacy-host y vuelve a conectar.

ssh-dss en OpenSSH 10 o superior

Cronología de DSA en OpenSSH:

VersiónFechaDSA (ssh-dss)
7.02015-08Desactivado por defecto; +ssh-dss lo reactiva
9.82024-07-01Desactivado al compilar (--enable-dsa-keys para conservarlo)
10.02025-04-09Eliminado. No hay opción que lo devuelva

Debian 13 (trixie) trae openssh-client 10.0p1 y macOS Tahoe OpenSSH_10.0p2. En esos clientes:

1
2
$ ssh -o HostKeyAlgorithms=+ssh-dss admin@legacy-host
command-line line 0: Bad key types '+ssh-dss'.

Comprueba qué sabe tu cliente antes de pelearte con las opciones:

1
2
3
4
ssh -V
ssh -Q key | grep -c ssh-dss   # 0 = tu cliente ya no habla ssh-dss
ssh -Q kex | grep sha1         # group1/group14-sha1 siguen en 10.x
ssh -Q cipher | grep cbc       # aes*-cbc y 3des-cbc siguen en 10.x

Si el grep -c da 0, la salida práctica es un cliente viejo en un contenedor. Debian 12 (bookworm) trae OpenSSH 9.2p1, que todavía compila DSA:

1
2
3
4
5
docker run --rm -it debian:bookworm bash -c '
  apt-get update -qq && apt-get install -y -qq openssh-client >/dev/null &&
  ssh -o HostKeyAlgorithms=+ssh-dss \
      -o KexAlgorithms=+diffie-hellman-group1-sha1 \
      admin@192.168.1.10'

Con password funciona tal cual; si necesitas una llave, móntala con -v. PuTTY (y plink) también siguen aceptando DSA, con aviso.

La solución de fondo es del lado del servidor: firmware nuevo o un host key ed25519 / RSA con rsa-sha2-256 (OpenSSH server lo soporta desde 7.2).

Ver qué ofrece el servidor

1
2
ssh -vv admin@legacy-host 2>&1 | grep -i 'their offer'
nmap -p 22 --script ssh2-enum-algos legacy-host

ssh2-enum-algos lista kex, host keys, ciphers y MACs del servidor sin autenticarte.

Trampas

  • Es un parche, no un arreglo: firmas SHA-1 y DH de 1024 bits (group1) son débiles. Úsalo solo en redes de management aisladas y planea actualizar el equipo.
  • OpenSSH 10.0 también quitó los kex diffie-hellman-group* de los defaults de sshd; el cliente los conserva. Si es un servidor 10.x el que rechaza a un cliente viejo, el ajuste va en sshd_config, no aquí.
  • En Fedora/RHEL además existe crypto-policies. Un bloque Host en ~/.ssh/config se lee antes que la política del sistema y es más seguro que bajar todo a LEGACY.
  • En Windows, el ssh.exe integrado es OpenSSH y acepta las mismas opciones; ssh -V te dice qué versión traes.

Ver también