Comment faire pour résoudre Java UnknownHostKey, tout en utilisant JSch SFTP bibliothèque?
Je suis en cours d'exécution d'un programme java où je transférer un fichier d'un dossier à l'autre, à l'aide de Java SFTP. Le problème que je vais avoir c'est que je reçois l'erreur suivante dans mon Java SFTP (à l'aide de JSch) :
C:\Oracle\Middleware\Oracle_Home\oracle_common\jdk\bin\javaw.exe
-serveur -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.le protocole ssl.trustStore=C:\Users\IBM_AD~1\AppData\Local\Temp\trustStore5840796204189742395.jks
Le transfert de fichiers com.jcraft.jsch.JSchException: UnknownHostKey: 127.0.0.1.
RSA empreinte de clé 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.
Voici mon code pour l'instant:
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 mis en place, et j'ai vérifié (avec netstat -a -b
) qu'il est en cours d'exécution.
OriginalL'auteur Coffee | 2015-09-29
Vous devez vous connecter pour publier un commentaire.
Vous essayez de sauter une clé d'hôte de la vérification par la mise en
StrictHostKeyChecking
àno
.Mais vous devez le faire avant la vérification, c'est à dire avant la
session.connect()
.De toute façon, vous ne devriez jamais faire cela, à moins que vous ne vous souciez pas de la sécurité. La clé de l'hôte, le contrôle est là pour vous protéger de man-in-the-middle attaques.
Au lieu de cela, mettre en place une attendu de la clé d'hôte de laisser JSch de le vérifier.
Par exemple:
Appel
JSch.setKnownHosts
fournir un chemin d'accès à un.ssh/known_hosts
de fichiers de type.Pour générer le
.ssh/known_hosts
-comme fichier, vous pouvez utiliser unssh-keyscan
commande de OpenSSH. Si vous vous connectez à partir d'un *nix serveur, vous devez disposer de la commande, il suffit d'exécuterIl aura un format comme:
Et de référence générés
known_hosts
fichier dans votre JSch code.Si vous êtes sur Windows, vous pouvez obtenir une version de Windows
ssh-keyscan
de Win32-OpenSSH projet ou Git pour Windows.Appel
JSch.getHostKeyRepository().add()
de fournir les attendus de la clé d'hôte (par exemple codée en dur, comme vos autres informations d'identification).Voir La création de JSch Clef instance à partir d'une clé publique .pub format.
J'ai ajouté un exemple pour la génération de la
known_hosts
fichier.J'ai essayé de courir
ssh-keyscan example.com > known_hosts
dans Cygwin sous Windows), mais je ne suis pas sûr de quoi faire ici.. est-il téléchargé sur mon ordinateur ? merci1) j'espère que vous avez compris que le
example.com
devrait être remplacé par le nom d'hôte du serveur SSH/IP. 2) Si vous l'exécuter localement, le fichier est enregistré en local (pas de téléchargement nécessaire). Il suffit de prendre un chemin d'accès à l'généréknown_hosts
fichier et de le transmettre àJSch.setKnownHosts
. 3) Vérifier que leknown_hosts
ressemble à l'exemple de ma réponse.Ok, je comprends maintenant, merci beaucoup !!!
OriginalL'auteur Martin Prikryl
De côté: par "Cygwin" je suppose que vous voulez dire sshd ou sftpd, parce que Cygwin lui-même ne fait pas de SSH.
De toute façon, si vous voulez Jsch client d'accepter n'importe quelle touche de l'hôte, déplacez le
.setConfig
appels qui définitStrictHostKeyChecking no
de sorte qu'il est avantsession.connect()
. Sinon, vous devez fournir l'accès à un magasin contenant la clé appropriée(s) pour vos hôtes(s) @Martin explique -- et vous devriez toujours le faire lors de la connexion à rien d'autre que "localhost" ou, éventuellement, d'une machine à certains d'être sur la même, physiquement sécurisé segment de réseau (tel qu'un réseau local câblé hub au sein d'une seule chambre).bon point, ajouté
qu'est-ce que sftpd par le chemin?
Je voulais dire "n'importe quel serveur (sous Unix en général quelque chose-d) qui implémente le protocole sftp en particulier, mais pas le reste de ssh". Pour Linux c'est généralement (pas toujours) vsftpd, mais je ne sais pas à propos de cygwin. Je devrais probablement dire "un serveur sftp".
Pour Linux, c'est OpenSSH, pas de vsftpd. La même pour Cygwin.
OriginalL'auteur dave_thompson_085
jsch version : 0.1.55
mon problème résolu en exécutant :
**dans mon cas jsch était à la recherche de l'adresse ip dans le fichier known_hosts
Il y a une surcharge de
setKnownHosts
qui prend un nom de fichier. DoncopenInputStream
est inutile. Vous pouvez simplement fairejsch.setKnownHosts(System.getProperty("user.home")+"/.ssh/known_hosts");
Merci , ajoute-il.
OriginalL'auteur swaz