2011-10-24 9 views
6

Mam dziwny problem z sshj (używam sshj v0.6.0), dla którego potrzebowałbym pomocy od kogoś. Uwierzytelnianie za pomocą klucza publicznego działa dobrze na niektórych komputerach, ale nie działa dobrze na innych komputerach i widzę poniższy błąd.Radzenie sobie z "[HOST_KEY_NOT_VERIFIABLE] Nie można zweryfikować klucza` ssh-rsa` z odciskami palca "w sshj

Jedyna różnica, że ​​mogę zrozumieć, że UNIX ID w pytanie mianowicie coonradt wydaje się mieć niżej wymienionych ustawień konfiguracyjnych w ~/.ssh/config tylko na polu, na którym poniżej błędy są wyzwalane

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

Z powyższego pliku konfiguracyjnego dowiedziałem się, że dany identyfikator powinien wykorzystywać protokół 1,2 i podejrzewam, że może to mieć coś wspólnego z moimi niepowodzeniami (nie jestem do końca pewny, ale to tylko przeczucie)

Dla wszystkich innych identyfikatorów UNIX, dla których to działa dobrze, nie mam żadnego takiego pliku konfiguracyjnego.

PS: Nie mogę zmienić konfiguracji identyfikatora UNIX "coonradt", ponieważ ten identyfikator jest używany przez centralne serwery hudson.

Czy wdzięczni, jeśli ktoś może mi pomóc, aby zasugerować co może być źle tutaj

Poniżej znajduje się błąd, że widzę:

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

Myślę, że problem dotyczy właśnie konfiguracji użytkownika coonradt, patrz ostrzeżenie SEVERE: "SEVERE: plik mymachine.domena.com nie został dodany do pliku /x/home/coonradt/.ssh/known_hosts. "Powinieneś to naprawić ;-) –

+0

Cześć, dziękuję bardzo za szybką odpowiedź, ale czy możesz zasugerować, co powinna naprawić dana użytkownikowi? Czy to oznacza, że ​​musiałbym pozbyć się protokołu? Miałem nadzieję, że sshj w jakiś sposób pozwoli mi na określenie wersji protokołu, która może być użyta (proszę o zachowanie mojej naiwności, jeśli brzmi to bełkotliwie, ale jak wyznałem, nie wiem zbyt wiele o wnętrzach o tym, jak działa ssh) –

+0

W rzeczywistości ma bardzo niewiele wspólnego z protokołem (w rzeczywistości, nic tak daleko, jak ta wiadomość dotyczy.) Co musi się stać, że plik "/ x/home/coonradt /.ssh/known_hosts "powinien w tym przypadku zawierać odcisk palca twojego klienta. Sądzę, że natknąłeś się na środek bezpieczeństwa, którego nie każdy komputer może połączyć, używając tego użytkownika do tego serwera. –

Odpowiedz

12

Jak o dodanie HostKeyVerifier dla tego urządzenia?

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

Powodem nie zdarza się automatycznie to prawdopodobnie dlatego, że plik known_hosts nie jest $ (user.home) /. Ssh/known_hosts. Można również jawnie załadować znane hosty z określonej lokalizacji.

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

@Shikar: Nie sądzę, że problem ma cokolwiek wspólnego z plikiem known_host. Doszedłem do wniosku, że sshj po prostu nie obsługuje protokołu ssh v1 w mojej ograniczonej wiedzy. –

+1

@Shikar: Zajrzyj na stronę https://gist.github.com/1321719, która szczegółowo opisuje problem. –

+0

@Shikar: Zapomniałem również powiedzieć, że plik known_hosts jest dostępny w folderze ~/.ssh i tam potwierdziłem jego dostępność. –

0

Aby uzyskać alternatywną odpowiedź, upewnij się, że nazwa hosta, z którą próbujesz się połączyć, jest dokładnie zgodna z plikiem known_hosts. Przykładem błędem, że robiłem próbował podłączyć się do pełnego adresu URL bob.insidenetwork.pvt ale mój plik known_hosts miał tylko bob jako wpis, bo kiedy ssh ręcznie jestem zbyt leniwy, aby wpisać cały adres URL ...

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

można ustawić klienta SSH, aby zaakceptować wszystkie klucze bez żadnej weryfikacji (ignoruje gospodarzem weryfikacji klucza)

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

To działa dla mnie:

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

Odrzucanie wyjątków to zła praktyka. – Kenster

Powiązane problemy