196 votes

com.jcraft.jsch.JSchException : UnknownHostKey

J'essaie d'utiliser Jsch pour établir une connexion SSH en Java. Mon code produit l'exception suivante :

com.jcraft.jsch.JSchException: UnknownHostKey: mywebsite.com. 
RSA key fingerprint is 22:fb:ee:fe:18:cd:aa:9a:9c:78:89:9f:b4:78:75:b4

Je ne trouve pas comment vérifier la clé hôte dans la documentation de Jsch. J'ai inclus mon code ci-dessous.

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class ssh {
    public static void main(String[] arg) {

        try {
            JSch jsch = new JSch();

            //create SSH connection
            String host = "mywebsite.com";
            String user = "username";
            String password = "123456";

            Session session = jsch.getSession(user, host, 22);
            session.setPassword(password);
            session.connect();

        } catch(Exception e) {
            System.out.println(e);
        } 
    }
}

0 votes

Essayez d'arrêter sshd sur votre hôte *nix, et démarrez un seul thread au premier plan : /usr/sbin/sshd -d Cela vous donnera beaucoup d'informations de débogage du côté de sshd.

0 votes

@AmmSokun tout le monde a été capable de résoudre ce problème. Voir les réponses.

249voto

Pascal Thivent Points 295221

Je le ferais soit :

  1. Essayez de ssh à partir de la ligne de commande et accepter la clé publique (l'hôte sera ajouté à ~/.ssh/known_hosts et tout devrait alors fonctionner correctement à partir de Jsch) -OR-
  2. Configurez JSch pour qu'il n'utilise pas "StrictHostKeyChecking" (cela introduit des insécurités et ne devrait être utilisé qu'à des fins de test), en utilisant le code suivant :

    java.util.Properties config = new java.util.Properties(); 
    config.put("StrictHostKeyChecking", "no");
    session.setConfig(config);

Option #1 (ajouter l'hôte à la ~/.ssh/known_hosts ) a ma préférence.

45 votes

JSch#setConfig("StrictHostKeyChecking", "no") fera le même travail, mais en une seule ligne

2 votes

Remarque : j'ai utilisé ce retour d'information pour configurer ma ~/.ssh/config pour corriger l'erreur ci-dessus lorsque je n'avais pas accès à la modification du code source.

0 votes

Qu'avez-vous fait à votre .ssh/config ? J'ai la même erreur.

41voto

krishnakumarp Points 2676

Le fait d'éviter la vérification des clés de l'hôte constitue un risque pour la sécurité.

JSch utilise l'interface HostKeyRepository et son implémentation par défaut la classe KnownHosts pour gérer cela. Vous pouvez fournir une implémentation alternative qui autorise des clés spécifiques en implémentant HostKeyRepository. Vous pouvez également conserver les clés que vous souhaitez autoriser dans un fichier dans le répertoire de l'utilisateur. format known_hosts et appeler

jsch.setKnownHosts(knownHostsFileName);

Ou avec une clé publique String comme ci-dessous.

String knownHostPublicKey = "mysite.com ecdsa-sha2-nistp256 AAAAE............/3vplY";
jsch.setKnownHosts(new ByteArrayInputStream(knownHostPublicKey.getBytes()));

voir Javadoc pour plus de détails.

Ce serait une solution plus sûre.

Jsch est un logiciel libre dont vous pouvez télécharger les sources à l'adresse suivante ici . Dans le dossier des exemples, recherchez KnownHosts.java pour en savoir plus.

17voto

CharityAbbott Points 930

Selon le programme que vous utilisez pour ssh, la façon d'obtenir la clé appropriée peut varier. Putty (populaire sous Windows) utilise son propre format pour les clés ssh. Avec la plupart des variantes de Linux et BSD que j'ai vues, il suffit de chercher dans ~/.ssh/known_hosts . En général, je me connecte à partir d'une machine Linux et je copie ce fichier sur une machine Windows. Ensuite, j'utilise quelque chose de similaire à

jsch.setKnownHosts("C:\\Users\\cabbott\\known_hosts");

En supposant que j'ai placé le fichier dans C:\Users\cabbott sur ma machine Windows. Si vous n'avez pas accès à une machine Linux, essayez de http://www.cygwin.com/

Peut-être que quelqu'un d'autre peut suggérer une autre alternative Windows. Je trouve que la façon dont Putty gère les clés SSH en les stockant dans le registre dans un format non standard est gênante à extraire.

0 votes

Sous Windows, en utilisanth ssh in cygwin (vous devez télécharger le openssl et ses dépendances), j'ai pu télécharger ~/.ssh/known_hosts . Merci à @CharityAbbott.

7voto

Amaury D Points 3

Vous pouvez aussi simplement faire

session.setConfig("StrictHostKeyChecking", "no");

Ce n'est pas sûr et c'est une solution de contournement qui ne convient pas à un environnement réel, car elle désactive la vérification des clés d'hôte connues dans le monde entier.

2 votes

Bien que ce code puisse aider à répondre à la question, les réponses basées uniquement sur le code ne sont pas de grande qualité. Une meilleure réponse expliquerait ce que fait le code, dirait où l'insérer, expliquerait pourquoi cette approche a été adoptée et établirait un lien vers la documentation pertinente.

6voto

Vous pouvez également exécuter le code suivant. Il est testé et fonctionne.

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UIKeyboardInteractive;
import com.jcraft.jsch.UserInfo;

public class SFTPTest {

    public static void main(String[] args) {
        JSch jsch = new JSch();
        Session session = null;
        try {
            session = jsch.getSession("username", "mywebsite.com", 22); //default port is 22
            UserInfo ui = new MyUserInfo();
            session.setUserInfo(ui);
            session.setPassword("123456".getBytes());
            session.connect();
            Channel channel = session.openChannel("sftp");
            channel.connect();
            System.out.println("Connected");
        } catch (JSchException e) {
            e.printStackTrace(System.out);
        } catch (Exception e){
            e.printStackTrace(System.out);
        } finally{
            session.disconnect();
            System.out.println("Disconnected");
        }
    }

    public static class MyUserInfo implements UserInfo, UIKeyboardInteractive {

        @Override
        public String getPassphrase() {
            return null;
        }
        @Override
        public String getPassword() {
            return null;
        }
        @Override
        public boolean promptPassphrase(String arg0) {
            return false;
        }
        @Override
        public boolean promptPassword(String arg0) {
            return false;
        }
        @Override
        public boolean promptYesNo(String arg0) {
            return false;
        }
        @Override
        public void showMessage(String arg0) {
        }
        @Override
        public String[] promptKeyboardInteractive(String arg0, String arg1,
                String arg2, String[] arg3, boolean[] arg4) {
            return null;
        }
    }
}

Veuillez substituer les valeurs appropriées.

0 votes

Oui, j'avais ajouté cela pour ma référence. Je vais le supprimer. Merci.

1 votes

Cela a créé des problèmes d'authentification bizarres lors de la connexion à certains serveurs SSH offrant la méthode d'authentification par clavier interactif. Je l'ai utilisé pendant des années pour me débarrasser du problème de la clé et je me suis brûlé aujourd'hui avec un certain serveur. Parce que je n'ai pas fourni le PW via getPassword() mais directement à l'objet Session. Gardez cela à l'esprit. Je ne l'utiliserais plus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X