web-dev-qa-db-fra.com

Comment résoudre Java UnknownHostKey, tout en utilisant la bibliothèque JSch SFTP?

J'exécute un programme Java où je transfère un fichier d'un dossier à un autre, en utilisant Java SFTP. Le problème que j'ai est que je ' m obtenir l'erreur suivante dans mon Java SFTP (en utilisant JSch):

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. L'empreinte digitale de la clé RSA est a2: 39: 3f: 44: 88: e9: 1f: d7: d1: 71: f4: 85: 98: fb: 90: dc sur com.jcraft.jsch.Session.checkHost (Session.Java: 797) sur com.jcraft.jsch.Session.connect (Session.Java:342) sur com.jcraft.jsch.Session.connect (Session.Java:183) sur FileTransfer.main (FileTransfer.Java:33) Processus terminé avec code de sortie 0.

Voici mon code jusqu'à présent:

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

Mon Cygwin est configuré et j'ai vérifié (avec netstat -a -b) qu'il fonctionne.

13
Coffee

Vous essayez d'ignorer une vérification de clé d'hôte en définissant StrictHostKeyChecking sur no.

Mais vous devez le faire avant la vérification, c'est-à-dire avant la session.connect().


Quoi qu'il en soit, vous ne devriez jamais faire cela, sauf si vous ne vous souciez pas de la sécurité. La vérification de la clé de l'hôte est là pour vous protéger de attaques de l'homme du milie .

Au lieu de cela, configurez une clé d'hôte attendue pour permettre à JSch de la vérifier.

Par exemple:

  • Appelez JSch.setKnownHosts en fournissant un chemin vers un fichier semblable à .ssh/known_hosts.

    Pour générer le fichier similaire à .ssh/known_hosts, Vous pouvez utiliser une commande ssh-keyscan D'OpenSSH. Si vous vous connectez à partir d'un serveur * nix, vous devriez avoir la commande disponible, exécutez simplement

    ssh-keyscan example.com > known_hosts
    

    Il aura un format comme:

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

    Et référencez le fichier known_hosts Généré dans votre code JSch.

    Si vous êtes sous Windows, vous pouvez obtenir une version Windows de ssh-keyscan Depuis projet Win32-OpenSSH ou Git pour Windows.

  • Appelez JSch.getHostKeyRepository().add() pour fournir la clé d'hôte attendue (par exemple, codée en dur, comme vos autres informations d'identification).

    Voir Création d'une instance JSch HostKey à partir d'une clé publique au format .pub .

22
Martin Prikryl

version jsch: 0.1.55

mon problème résolu en exécutant:

ssh-keyscan -t rsa <Host_NAME> >> ~/.ssh/known_hosts
ssh-keyscan -t rsa <IP_ADDRESS_OF_Host_NAME> >> ~/.ssh/known_hosts

** dans mon cas, jsch cherchait une adresse IP dans le fichier known_hosts

jsch.setKnownHosts(System.getProperty("user.home")+"/.ssh/known_hosts");
5
swaz

À part: par "Cygwin", je suppose que vous voulez dire sshd ou sftpd, parce que Cygwin lui-même ne fait pas SSH.

Quoi qu'il en soit, si vous voulez que le client Jsch accepte n'importe quelle clé de l'hôte, déplacez les appels .setConfig Qui définissent StrictHostKeyChecking no Pour qu'il soit avantsession.connect() . Alternativement, vous devez fournir un accès à un magasin contenant la ou les clés correctes pour vos hôtes comme l'explique @Martin - et vous devez toujours le faire lorsque vous vous connectez à autre chose que "localhost" ou éventuellement à une machine qui sera sur le même segment de réseau physiquement sécurisé (tel qu'un concentrateur LAN câblé dans une seule pièce).

3
dave_thompson_085