No se puede negociar con XX.XXX.XX.XX: no se encontró ningún tipo de clave de host coincidente. Su oferta: ssh-dss

110

Estoy tratando de crear un repositorio de git en mi servidor web y clonarlo en mi computadora. Esto es lo que hice:

  1. Creé un repositorio en el servidor remoto.
  2. Me genera un par de claves: ssh-keygen -t dsa.
  3. Agregué mi clave a ssh-agent.
  4. Copié a la clave pública del servidor en ~/.ssh.

Y luego, después de un intento de ejecutar el comando git clone ssh://user@host/path-to-repository, aparece un error:

No se puede negociar con XX.XXX.XX.XX: no se encontró ningún tipo de clave de host coincidente. Su oferta: ssh-dss
fatal: no se pudo leer desde el repositorio remoto.
Asegúrese de tener los derechos de acceso correctos y de que el repositorio existe.

Qué significa eso?

Nikita Gorshkov
fuente

Respuestas:

171

La versión reciente de openssh desaprobó las claves DSA de forma predeterminada. Debe sugerirle a su proveedor de GIT que agregue una clave de host razonable. Depender únicamente de los DSA no es una buena idea.

Como solución alternativa, debe informar a su sshcliente que desea aceptar claves de host DSA, como se describe en la documentación oficial para el uso heredado . Tiene pocas posibilidades, pero le recomiendo agregar estas líneas a su ~/.ssh/configarchivo:

Host your-remote-host
    HostkeyAlgorithms +ssh-dss

Otra posibilidad es usar la variable de entorno GIT_SSHpara especificar estas opciones:

GIT_SSH_COMMAND="ssh -oHostKeyAlgorithms=+ssh-dss" git clone ssh://user@host/path-to-repository
Jakuje
fuente
1
Ahora ha funcionado sin especificar el nombre de host, solo con HostkeyAlgorithms +ssh-dss. Gracias.
giovannipds
1
@giovannipds Sin duda, debe ser el host remoto al que se está conectando. @ downvoters Explicar los votos negativos sería bueno.
Jakuje
@Jakuje, lo siento, hice clic mal y, debido a la imposibilidad de cambiar de inmediato, no pude actualizar mi respuesta.
giovannipds
1
@Jakuje Ya actualicé mi voto, solo para avisarte. =)
giovannipds
Si no existe tal archivo en su directorio .ssh, un archivo de texto vacío llamado "config" servirá.
RMorrisey
78

También puede agregar -oHostKeyAlgorithms=+ssh-dssen su línea ssh:

ssh -oHostKeyAlgorithms=+ssh-dss user@host
Guillaume
fuente
Esta es la solución más rápida +1 porque también soluciona permanentemente el problema para ese host. Una sugerencia más para el largo plazo es que, si es posible, el sistema host debería actualizar su demonio SSH, ya que parece que DSS ya no lo considera muy seguro.
Areeb Soo Yasir
20

Para mí esto funcionó: (agregado a .ssh\config)

Host *
HostkeyAlgorithms +ssh-dss
PubkeyAcceptedKeyTypes +ssh-dss
usuario2885534
fuente
La segunda opción no está relacionada con el problema y la primera ya se menciona en mi respuesta.
Jakuje
Host your-host no funcionó para mí, siempre que your-host sea el nombre del host desde el que estoy ejecutando el comando ssh (cliente). Pero Host * funcionó para mí.
Krischu
2
@Krischu no, yuor-hostes el anfitrión sshcontra el que te enfrentas. Establecer valores predeterminados no seguros para todos los hosts siempre es una mala idea.
Jakuje
10

Si eres como yo, y prefieres no hacer este sistema de agujeros de seguridad o para todo el usuario, puedes agregar una opción de configuración a cualquier repositorio git que lo necesite ejecutando este comando en esos repositorios. (la nota solo funciona con la versión de git> = 2.10, lanzada el 2016-09-04)

git config core.sshCommand 'ssh -oHostKeyAlgorithms=+ssh-dss'

Sin embargo, esto solo funciona después de que se configura el repositorio. Si no se siente cómodo agregando un control remoto manualmente (y solo desea clonar), puede ejecutar el clon de esta manera:

GIT_SSH_COMMAND='ssh -oHostKeyAlgorithms=+ssh-dss' git clone ssh://user@host/path-to-repository

luego ejecute el primer comando para hacerlo permanente.

Si no tiene lo último y aún así le gustaría mantener el hoyo lo más local posible, le recomiendo poner

export GIT_SSH_COMMAND='ssh -oHostKeyAlgorithms=+ssh-dss'

en un archivo en algún lugar, digamos git_ssh_allow_dsa_keys.sh, e sourceingréselo cuando sea necesario.

golvok
fuente
3

Quiero colaborar un poco con la solución del lado del servidor. Entonces, el servidor dice que no es compatible con DSA, esto se debe a que el cliente openssh no lo activa de forma predeterminada :

OpenSSH 7.0 y versiones posteriores deshabilitan de manera similar el algoritmo de clave pública ssh-dss (DSA). También es débil y no recomendamos su uso.

Entonces, para solucionar esto en el lado del servidor, debería activar otros algoritmos clave como RSA o ECDSA. Acabo de tener este problema con un servidor en una lan. Sugiero lo siguiente:

Actualice el openssh:

yum update openssh-server

Fusionar nuevas configuraciones en sshd_config si hay un sshd_config.rpmnew.

Verifique que haya claves de hosts en / etc / ssh /. Si no genera otros nuevos, consulte man ssh-keygen.

$ ll /etc/ssh/
total 580
-rw-r--r--. 1 root root     553185 Mar  3  2017 moduli
-rw-r--r--. 1 root root       1874 Mar  3  2017 ssh_config
drwxr-xr-x. 2 root root       4096 Apr 17 17:56 ssh_config.d
-rw-------. 1 root root       3887 Mar  3  2017 sshd_config
-rw-r-----. 1 root ssh_keys    227 Aug 30 15:33 ssh_host_ecdsa_key
-rw-r--r--. 1 root root        162 Aug 30 15:33 ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys    387 Aug 30 15:33 ssh_host_ed25519_key
-rw-r--r--. 1 root root         82 Aug 30 15:33 ssh_host_ed25519_key.pub
-rw-r-----. 1 root ssh_keys   1675 Aug 30 15:33 ssh_host_rsa_key
-rw-r--r--. 1 root root        382 Aug 30 15:33 ssh_host_rsa_key.pub

Verifique en / etc / ssh / sshd_config la configuración de HostKey. Debería permitir la configuración de RSA y ECDSA. (Si todos ellos están comentados por defecto permitirá también el RSA, ver en man sshd_configla parte de HostKey).

# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

Para el lado del cliente, cree una clave para ssh (no un DSA como en la pregunta) simplemente haciendo esto:

ssh-keygen

Después de esto, debido a que hay más opciones que ssh-dss (DSA), el cliente openssh (> = v7) debería conectarse con RSA o un algoritmo mejor.

Aquí otro buen artículo.

Esta es mi primera pregunta respondida, doy la bienvenida a sugerencias: D.

Gus Calca
fuente
1

¿Cómo se especificarían varios algoritmos? Lo pregunto porque git acaba de actualizarse en mi computadora portátil de trabajo (Windows 10, usando la compilación oficial de Git para Windows) y recibí este error cuando intenté enviar una rama del proyecto a mi control remoto de Azure DevOps. Traté de empujar --set-upstream y obtuve esto:

Unable to negotiate with 20.44.80.98 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1,diffie-hellman-group14-sha1
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Entonces, ¿cómo se implementarían las sugerencias anteriores teniendo en cuenta ambos? (Como solución rápida, utilicé la solución de @ golvok con group14 y funcionó, pero realmente no sé si 1 o 14 es mejor, etc.)

Janet
fuente
-3

O sigue el enfoque anterior o este

Cree el archivo de configuración en el directorio .ssh y agregue estas líneas.

host xxx.xxx
 Hostname xxx.xxx
 IdentityFile ~/.ssh/id_rsa
 User xxx
 KexAlgorithms +diffie-hellman-group1-sha1
ashokhein
fuente
Eso está resolviendo un problema completamente diferente.
Jakuje