2011-10-24 30 views
6

Tengo un problema extraño con sshj (estoy usando sshj v0.6.0) para el que necesitaría ayuda de alguien. La autenticación con clave pública funciona bien en algunas máquinas, pero no funciona bien en otras máquinas y veo el siguiente error.Tratando con "[HOST_KEY_NOT_VERIFIABLE] No se pudo verificar la clave de host 'ssh-rsa` con huella digital" en sshj

La única diferencia que pude ver fue que el ID de UNIX en Coonradt pregunta a saber parece tener la configuración siguiente configuración que aparece en ~/.ssh/config sólo en la casilla en la que los errores a continuación se activan

Host * 
    Protocol 1,2 
    FallBackToRsh no 
    ForwardAgent yes 
    ForwardX11 yes 
    PasswordAuthentication yes 
    RhostsAuthentication no 
    RhostsRSAAuthentication no 
    RSAAuthentication yes 
    NoHostAuthenticationForLocalhost yes 
    StrictHostKeyChecking no 
    KeepAlive yes 

A partir del archivo de configuración anterior, me enteré de que la identificación en cuestión debe usar el protocolo 1,2 y sospecho que esto podría tener algo que ver con mis fallas (no estoy muy seguro, pero esto es sólo una corazonada)

Para todos los demás ID de UNIX para los que funciona bien, no tengo ningún archivo de configuración.

PD: No puedo modificar la configuración de la ID de UNIX "coonradt" ya que esta identificación está siendo utilizada por los servidores hudson centrales.

agradecería si alguien podría por favor ayuda me sugieren en cuanto a lo que podría estar mal aquí

A continuación se presenta el error que estoy viendo:

Oct 24, 2011 2:30:37 AM net.schmizz.sshj.DefaultConfig initCipherFactories 
WARNING: Disabling high-strength ciphers: cipher strengths apparently limited by JCE policy 
Oct 24, 2011 2:30:38 AM net.schmizz.sshj.transport.TransportImpl init 
INFO: Client identity string: SSH-2.0-SSHJ_0_6_0 
Oct 24, 2011 2:30:38 AM net.schmizz.sshj.transport.TransportImpl init 
INFO: Server identity string: SSH-1.99-OpenSSH_4.3 
Oct 24, 2011 2:30:38 AM net.schmizz.sshj.transport.KeyExchanger sendKexInit 
INFO: Sending SSH_MSG_KEXINIT 
Oct 24, 2011 2:30:38 AM net.schmizz.sshj.transport.KeyExchanger handle 
INFO: Received SSH_MSG_KEXINIT 
Oct 24, 2011 2:30:38 AM net.schmizz.sshj.transport.kex.AbstractDHG init 
INFO: Sending SSH_MSG_KEXDH_INIT 
Oct 24, 2011 2:30:38 AM net.schmizz.sshj.transport.KeyExchanger handle 
INFO: Received kex followup data 
Oct 24, 2011 2:30:38 AM net.schmizz.sshj.transport.kex.AbstractDHG next 
INFO: Received SSH_MSG_KEXDH_REPLY 
Oct 24, 2011 2:30:38 AM net.schmizz.sshj.transport.TransportImpl die 
SEVERE: Dying because - net.schmizz.sshj.transport.TransportException: [HOST_KEY_NOT_VERIFIABLE] Could not verify `ssh-rsa` host key with fingerprint `ca:0b:b3:7f:53:5a:e3:bc:bf:44:63:d8:2d:26:c0:41` for `mymachine.domain.com` on port 22 
Oct 24, 2011 2:30:38 AM net.schmizz.concurrent.Promise tryRetrieve 
SEVERE: <<kex done>> woke to: net.schmizz.sshj.transport.TransportException: [HOST_KEY_NOT_VERIFIABLE] Could not verify `ssh-rsa` host key with fingerprint `ca:0b:b3:7f:53:5a:e3:bc:bf:44:63:d8:2d:26:c0:41` for `mymachine.domain.com` on port 22 
Oct 24, 2011 2:30:38 AM net.schmizz.sshj.transport.TransportImpl setService 
INFO: Setting active service to null-service 
Oct 24, 2011 2:30:38 AM com.test.jaws.execution.ssh.impl.SSHJClientImpl$ExceptionHandler handleSevereCondition 
SEVERE: mymachine.domain.com is not added to your /x/home/coonradt/.ssh/known_hosts file. 
Throwable occurred: net.schmizz.sshj.transport.TransportException: [HOST_KEY_NOT_VERIFIABLE] Could not verify `ssh-rsa` host key with fingerprint `ca:0b:b3:7f:53:5a:e3:bc:bf:44:63:d8:2d:26:c0:41` for `mymachine.domain.com` on port 22 
    at net.schmizz.sshj.transport.KeyExchanger.verifyHost(KeyExchanger.java:222) 
    at net.schmizz.sshj.transport.KeyExchanger.handle(KeyExchanger.java:373) 
    at net.schmizz.sshj.transport.TransportImpl.handle(TransportImpl.java:477) 
    at net.schmizz.sshj.transport.Decoder.decode(Decoder.java:127) 
    at net.schmizz.sshj.transport.Decoder.received(Decoder.java:195) 
    at net.schmizz.sshj.transport.Reader.run(Reader.java:72) 
+0

Creo que el problema está en la configuración de usuario coonradt, consulte el aviso SEVERE: "SEVERE: mymachine.domain.com no se agrega a su /x/home/coonradt/.ssh/known_hosts file. ". Probablemente deberías arreglar esto ;-) –

+0

Hola, muchas gracias por la pronta respuesta. ¿Pero puedes sugerir cuál debería ser la solución para el usuario? ¿Significa que tendría que deshacerme del Protocolo? sección en el archivo de configuración? Tenía la esperanza de que sshj de alguna manera me permitiera especificar la versión del protocolo también que se puede utilizar (Por favor, tenga paciencia con mi ingenuidad si eso sonaba galimatías, pero como confesé antes no sé demasiado sobre el funcionamiento interno de cómo funciona ssh) –

+0

Realmente tiene muy poco que ver con el protocolo (de hecho, nada en lo que se refiere a este mensaje). Lo que debe suceder es que el archivo '/ x/home/coonradt /.ssh/known_hosts 'debe contener la huella digital de su cliente en este caso. Creo que ha tropezado con una medida de seguridad que no todas las máquinas se pueden conectar usando ese usuario a ese servidor. –

Respuesta

12

Cómo sobre la adición de un HostKeyVerifier para esta máquina?

sshClient.addHostKeyVerifier("ca:0b:b3:7f:53:5a:e3:bc:bf:44:63:d8:2d:26:c0:41"); 

La razón por la que no se produce automáticamente es probablemente porque el archivo known_hosts no está en $ (user.home) /. Ssh/known_hosts. También puede cargar explícitamente hosts conocidos desde una ubicación específica.

sshClient.loadKnownHosts(new File("path_to_known_hosts")); 
+0

@Shikar: No creo que el problema tenga nada que ver con el archivo known_host en absoluto. Descubrí que sshj simplemente no maneja el protocolo ssh v1 en mi limitado conocimiento. –

+1

@Shikar: Por favor, eche un vistazo a https://gist.github.com/1321719 que detalla el problema. –

+0

@Shikar: También olvidé decirte que el archivo known_hosts está disponible en la carpeta ~/.ssh y confirmé su disponibilidad allí. –

0

Para una respuesta alternativa, asegúrese de que el nombre de host al que intenta conectarse coincide exactamente con su archivo known_hosts. Un ejemplo error que yo estaba haciendo estaba tratando de conectarse a la dirección URL completa bob.insidenetwork.pvt pero mi archivo known_hosts sólo tenía bob como una entrada porque cuando ssh manualmente Soy demasiado vago para escribir la dirección URL completa ...

7
try { 
    ssh.connect(envConf.getIp(), port); 
} catch (TransportException e) { 
    if (e.getDisconnectReason() == DisconnectReason.HOST_KEY_NOT_VERIFIABLE) { 
     String msg = e.getMessage(); 
     String[] split = msg.split("`"); 
     String vc = split[3]; 
     ssh = new SSHClient(); 
     ssh.addHostKeyVerifier(vc); 
     ssh.connect(envConf.getIp(), port); 
    } else { 
     throw e; 
    } 
} 
ssh.authPassword(envConf.getName(), envConf.getPw()); 
ssh.newSCPFileTransfer().download(envConf.getHomePath() + FilePath, toPath); 
8

Es posible configurar el cliente SSH para aceptar todas las teclas sin ninguna verificación (ignora el anfitrión de la comprobación de clave)

SSHClient sshClient = new SSHClient(); 
sshClient.addHostKeyVerifier(new PromiscuousVerifier()); 
... 
-1

funciona para mí:

try (final SSHClient sshClient = new SSHClient()) { 
    sshClient.addHostKeyVerifier(new PromiscuousVerifier()); 
    KeyProvider keys = sshClient.loadKeys("path_to_private_key.ppk"); 
    sshClient.connect("hostname"); 
    sshClient.authPublickey("username", keys); 
} catch (IOException e) { 
} 
+1

Descartar las excepciones es una mala práctica. – Kenster

Cuestiones relacionadas