J'essaye 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é d'hôte dans la documentation 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);
}
}
}
Réponses:
Je voudrais soit:
ssh
depuis la ligne de commande et acceptez la clé publique (l'hôte sera ajouté~/.ssh/known_hosts
et tout devrait alors fonctionner correctement à partir de Jsch) -OU-Configurez JSch pour ne pas utiliser "StrictHostKeyChecking" (cela introduit des insécurités et ne doit être utilisé qu'à des fins de test), en utilisant le code suivant:
L'option n ° 1 (ajouter l'hôte au
~/.ssh/known_hosts
fichier) a ma préférence.la source
JSch#setConfig("StrictHostKeyChecking", "no")
fera le même travail, mais en une seule ligne~/.ssh/config
fichier afin de corriger l'erreur ci-dessus lorsque je n'avais pas accès pour modifier le code sourceBien que la question ait reçu une réponse en général, je me suis rendu compte qu'il y a un cas où même l' entrée known_hosts existante n'aide pas. Cela se produit lorsqu'un serveur SSH envoie une empreinte digitale ECDSA et, par conséquent, vous aurez une entrée comme celle-ci:
Le problème est que JSch préfère SHA_RSA et lors de la connexion, il essaiera de comparer l'empreinte digitale SHA-RSA, ce qui entraînera une erreur sur "l'hôte inconnu".
Pour résoudre ce problème, exécutez simplement:
ou se plaindre à Jcraft de préférer SHA_RSA au lieu d'utiliser le paramètre HostKeyAlgorithms local , bien qu'ils ne semblent pas trop désireux de corriger leurs bogues .
la source
ecdsa-sha2-nistp384
, et votre solution fonctionne très bien. Conformément au manuel openssh-keyscan , et à nos besoins, nous exécutonsssh-keyscan -t rsa,ecdsa example.org >> known_hosts
.C'est un risque de sécurité d'éviter la vérification des clés de l'hôte.
JSch utilise l'interface HostKeyRepository et sa classe d'implémentation par défaut KnownHosts pour gérer cela. Vous pouvez fournir une autre implémentation qui autorise des clés spécifiques en implémentant HostKeyRepository. Ou vous pouvez conserver les clés que vous souhaitez autoriser dans un fichier au format known_hosts et appeler
Ou avec une chaîne de clé publique comme ci-dessous.
voir Javadoc pour plus de détails.
Ce serait une solution plus sûre.
Jsch est open source et vous pouvez télécharger la source à partir d' ici . Dans le dossier des exemples, recherchez KnownHosts.java pour en savoir plus.
la source
Selon le programme que vous utilisez pour ssh, la manière d'obtenir la clé appropriée peut varier. Putty (populaire avec Windows) utilise son propre format pour les clés ssh. Avec la plupart des variantes de Linux et BSD que j'ai vues, il vous suffit de regarder
~/.ssh/known_hosts
. Je ssh généralement depuis une machine Linux, puis je copie ce fichier sur une machine Windows. Ensuite, j'utilise quelque chose de similaire àEn supposant que j'ai placé le fichier
C:\Users\cabbott
sur ma machine Windows. Si vous n'avez pas accès à une machine Linux, essayez http://www.cygwin.com/Peut-être que quelqu'un d'autre peut suggérer une autre alternative Windows. Je trouve la manière de putty de gérer les clés SSH en les stockant dans le registre dans un format non standard gênant à extraire.
la source
cygwin
(vous devez télécharger leopenssl
package et les dépendances), j'ai pu télécharger~/.ssh/known_hosts
. Merci à @CharityAbbott.Fournissez la clé publique rsa de l'hôte: -
la source
Vous pouvez aussi simplement faire
Ce n'est pas sécurisé et c'est une solution de contournement qui ne convient pas à l'environnement en direct car elle désactivera la vérification des clés d'hôte mondialement connues.
la source
Vous pouvez également exécuter le code suivant. Il est testé et fonctionne.
Veuillez remplacer les valeurs appropriées.
la source
Remplacez simplement "utilisateur", "passer", "SSHD_IP". Et créez un fichier appelé known_hosts.txt avec le contenu de ~ / .ssh / known_hosts du serveur. Vous obtiendrez une coquille.
la source
config.put("StrictHostKeyChecking", "no");
Unessh -v
connexion manuelle révèle que le.ssh/known_hosts
fichier contient la clé (ecdsa-sha2-nistp256
) mais le code le fait:com.jcraft.jsch.JSchException: UnknownHostKey: 131.132.x.x. RSA key fingerprint is c2:...
at com.jcraft.jsch.Session.checkHost(Session.java:805)
at com.jcraft.jsch.Session.connect(Session.java:345)
il est préférable de définir un hôte connu que de définir une valeur d’impression digitale.
Lorsque vous définissez l'hôte connu, essayez de ssh manuellement (la toute première fois, avant que l'application ne s'exécute) à partir de la boîte dans laquelle l'application s'exécute.
la source
J'ai perdu beaucoup de temps sur ce problème stupide, et je pense que le message est tout à fait exact "il n'y a pas l'hôte dans le fichier auquel j'accède" mais vous pouvez avoir plus d'un fichier know_host sur votre système (par exemple, je J'utilise mobaXterm et il le garde dans le répertoire d'installation en montant le home à partir de cette racine).
Si vous rencontrez: cela fonctionne à partir de la ligne de commande mais pas depuis l'application, essayez d'accéder à votre serveur distant avec ssh et vérifiez avec l'option verbeuse -v quel fichier est actuellement utilisé, un exemple suivant:
comme vous pouvez le voir, la clé a été trouvée dans:
et pas dans ma maison Windows sous C: \ Users \ my_local_user \ .ssh, je les ai simplement fusionnés et alignés pour résoudre le problème.
J'espère que cela aidera quelqu'un à l'avenir
la source
Cette entrée de stackoverflow concerne la vérification de la clé d'hôte et il n'y a aucune relation avec l'authentification par clé publique.
Quant à l'authentification par clé publique, essayez l' exemple suivant avec votre clé privée simple (non chiffrée),
la source
la source