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

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 j'obtiens l'erreur suivante dans mon SFTP Java (en utilisant JSch):

C:OracleMiddlewareOracle_Homeoracle_commonjdkbinjavaw.EXE - server-classpath C:JDevelopermyworkJava_Hello_World.adf;C:JDevelopermyworkJava_Hello_WorldClientclasses;C:UsersADMINDownloadsjsch-0.1.53.pot - Djavax.net.ssl.truststststore=C:UsersIBM_AD~1AppDataLocalTemptrustststore5840796204189742395.jks Le transfert de fichiers 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 au com.jcraft.jsch.Session.checkHost(Session.java:797) à COM.jcraft.jsch.Session.connexion(Session.java: 342) à COM.jcraft.jsch.Session.connexion(Session.java: 183) à Le transfert de fichiers.principale(transfert de fichiers.java: 33) processus terminé avec le code de sortie 0.

ce qui suit est 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:UsersADMINDesktopWorkConnectOne_BancorpJava_WorkSFTP_1house.bmp", "C:UsersADMINDesktopWorkConnectOne_BancorpJava_WorkSFTP_2house.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.

10
demandé sur Martin Prikryl 2015-09-29 23:10:16

2 réponses

vous essayez de sauter la vérification d'une clé hôte en mettant StrictHostKeyChecking à no .

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


de toute façon, vous ne devriez jamais faire cela, à moins que vous ne vous souciez pas de la sécurité. La vérification de la clé hôte est là pour vous protéger des attaques man-in-the-middle .

à la place, mettre en place un clé hôte pour laisser JSch le vérifier.

par exemple:

  • Appel JSch.setKnownHosts fournir un chemin d'accès à un .ssh/known_hosts -comme fichier.

    pour générer le fichier de type .ssh/known_hosts , vous pouvez utiliser la commande ssh-keyscan d'OpenSSH. Si vous vous connectez à partir d'un serveur * nix, vous devez avoir la commande disponible, il suffit d'exécuter

    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érez le fichier généré known_hosts dans votre code JSch.

    si vous êtes sur Windows, vous pouvez obtenir une construction de Windows de ssh-keyscan de Win32-OpenSSH project ou Git pour Windows.

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

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

16
répondu Martin Prikryl 2018-03-13 12:00:24

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

de toute façon, si vous voulez que le client Jsch accepte n'importe quelle clé de l'hôte, déplacez les appels .setConfig qui définit StrictHostKeyChecking no donc c'est avant session.connect() . Alternativement, vous devez fournir l'accès à un magasin contenant la(Les) clé(s) correcte (s) pour vos hôtes (s) comme @Martin explique -- et vous devriez toujours faire cela lors de la connexion à autre chose que "localhost" ou peut-être une machine sûre d'être sur le même segment de réseau physiquement sécurisé (comme un hub LAN câblé dans une seule pièce).

1
répondu dave_thompson_085 2015-09-30 06:41:25