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.
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 commandessh-keyscan
d'OpenSSH. Si vous vous connectez à partir d'un serveur * nix, vous devez avoir la commande disponible, il suffit d'exécuterssh-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 .
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).