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.
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 .
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");
À 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).