2015-09-29 41 views
9

Używam programu java, w którym przesyłam plik z jednego folderu do drugiego za pomocą Java SFTP. Problem mam jest to, że ja otrzymuję następujący błąd w moim Java SFTP (używając jsch):Jak rozwiązać problem Java UnknownHostKey podczas korzystania z biblioteki JSch SFTP?

C: \ Oracle \ Middleware \ ORACLE_HOME \ oracle_common \ jdk \ bin \ javaw.exe - server -classpath C: \ JDeveloper \ mywork \ Java_Hello_World.adf; C: \ JDeveloper \ mywork \ Java_Hello_World \ Client \ classes; C: \ Users \ ADMIN \ Downloads \ jsch-0.1.53.jar -Djavax.net.ssl .trustStore = C: \ Users \ IBM_AD ~ 1 \ AppData \ Local \ Temp \ trustStore5840796204189742395.jks FileTransfer com.jcraft.jsch.JSchException: UnknownHostKey: 127.0.0.1. Kluczowy odcisk palca RSA to a2: 39: 3f: 44: 88: e9: 1f: d7: d1: 71: f4: 85: 98: fb: 90: dc na com.jcraft.jsch.Session.checkHost (Sesja. java: 797) pod adresem com.jcraft.jsch.Session.connect (Session.java: 342) pod adresem com.jcraft.jsch.Session.connect (Session.java:183) pod adresem FileTransfer.main (FileTransfer.java: 33) Proces zakończony z kodem wyjścia 0.

Oto mój kod do tej pory:

FileTransfer fileTransfer = new FileTransfer();    

JSch jsch = new JSch(); 

try { 

    String host = "127.0.0.1"; 
    int port = 22; 

    String user = "user"; 
    Session session = jsch.getSession(user, host, port);  
    session = jsch.getSession("username", "127.0.0.1", 22); 
    session.connect(); // bug here , java.net.ConnectException 

    ChannelSftp sftp = null; 
    sftp = (ChannelSftp)session.openChannel("sftp") ; //channel; 

    //extra config code 
    java.util.Properties config = new java.util.Properties(); 
    config.put("StrictHostKeyChecking", "no"); 
    session.setConfig(config); 
    // end extra config code 

    sftp.rename("C:\\Users\\ADMIN\\Desktop\\Work\\ConnectOne_Bancorp\\Java_Work\\SFTP_1\\house.bmp", "C:\\Users\\ADMIN\\Desktop\\Work\\ConnectOne_Bancorp\\Java_Work\\SFTP_2\\house.bmp"); 
    session.disconnect(); 

} catch (JSchException e) { 
    e.printStackTrace(); 
} catch (SftpException e) { 
    e.printStackTrace(); 
} //end-catch 

My Cygwin jest skonfigurowana, a sprawdziłem (z netstat -a -b), że to działa.

Odpowiedz

14

Próbujesz pominąć sprawdzanie klucza hosta, ustawiając StrictHostKeyChecking na no.

Ale musisz to zrobić przed sprawdzeniem, tj. Przed session.connect().


W każdym razie nie powinieneś tego robić, chyba że nie dbasz o bezpieczeństwo. Sprawdzanie klucza hosta zapewnia ochronę przed man-in-the-middle attacks.

Zamiast tego należy ustawić oczekiwany klucz hosta, aby umożliwić JSch jego weryfikację.

Na przykład:

  • połączeń JSch.setKnownHosts podanie ścieżki do .ssh/known_hosts -jak pliku.

    Aby wygenerować plik podobny do .ssh/known_hosts, można użyć polecenia ssh-keyscan z OpenSSH.Jeśli łączysz się z serwerem * nix, trzeba mieć komenda dostępna, wystarczy uruchomić

    ssh-keyscan example.com > known_hosts 
    

    Będzie miał format jak:

    example.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0hVqZOvZ7yWgie9OHdTORJVI5fJJoH1yEGamAd5G3werH0z7e9ybtq1mGUeRkJtea7bzru0ISR0EZ9HIONoGYrDmI7S+BiwpDBUKjva4mAsvzzvsy6Ogy/apkxm6Kbcml8u4wjxaOw3NKzKqeBvR3pc+nQVA+SJUZq8D2XBRd4EDUFXeLzwqwen9G7gSLGB1hJkSuRtGRfOHbLUuCKNR8RV82i3JvlSnAwb3MwN0m3WGdlJA8J+5YAg4e6JgSKrsCObZK7W1R6iuyuH1zA+dtAHyDyYVHB4FnYZPL0hgz2PSb9c+iDEiFcT/lT4/dQ+kRW6DYn66lS8peS8zCJ9CSQ== 
    

    i odniesienie do wygenerowanego known_hosts plik w kodzie jsch .

    Jeśli jesteś w systemie Windows, możesz uzyskać kompilację systemu Windows: ssh-keyscan, od Win32-OpenSSH project lub Git dla systemu Windows.

  • Zadzwoń pod numer JSch.getHostKeyRepository().add(), aby podać oczekiwany klucz hosta (np. Zakodowane na stałe, tak jak i inne poświadczenia).

    Zobacz Creating JSch HostKey instance from a public key in .pub format.

+0

Jak zrobić krok "skonfiguruj oczekiwany klucz hosta, aby umożliwić JSch jego weryfikację." , dzięki – Coffee

+1

Dodałem przykład do generowania pliku 'known_hosts'. –

+0

Próbowałem uruchomić 'ssh-keyscan example.com> known_hosts' w Cygwin (w systemie Windows), ale nie jestem pewien, co zrobić dalej .. czy jest on pobrany na moim komputerze? dzięki – Coffee

1

Na marginesie: przez "Cygwin" Zakładam, że masz na myśli sshd lub sftpd, ponieważ sam Cygwin nie wykonuje SSH.

W każdym razie, jeśli chcesz klient jsch przyjąć dowolny klawisz z hostem, przenieść połączenia .setConfig że zestawy StrictHostKeyChecking no więc przedsession.connect(). Alternatywnie musisz zapewnić dostęp do sklepu zawierającego poprawny klucz (klucze) dla twojego hosta (-ów), jak to wyjaśnia @Martin - i zawsze powinieneś to robić, gdy łączysz się z czymkolwiek innym niż "localhost" lub prawdopodobnie maszyną, która ma być włączona ten sam, fizycznie bezpieczny segment sieci (taki jak przewodowy koncentrator LAN w jednym pokoju).

+0

* "musisz" *: Nie sugeruj nikomu, aby nie weryfikował klucza hosta SSH. Przynajmniej nie bez wyjaśnienia konsekwencji. To straszny błąd bezpieczeństwa. –

+0

@ Goodart dobry punkt, dodano –

+0

co jest sftpd przy okazji? – Coffee