web-dev-qa-db-fra.com

com.jcraft.jsch.JSchException: annulation d'authentification

J'essaie d'écrire un script Ant pour récupérer une URL via le tunneling de port.

Cela fonctionne très bien lorsque j'utilise un mot de passe (les noms xxxx'd pour la confidentialité):

<project default="main">
  <target name="main">
    <sshsession Host="xxxx"
    username="xxxx"
    password="xxxx">
      <LocalTunnel lport="1080" rhost="xxxx" rport="80"/>
      <sequential>
        <get src="http://localhost:1080/xxxx" dest="/tmp/xxxx"/>
      </sequential>
    </sshsession>
  </target>
</project>

Mais cela ne fonctionne pas lorsque j'utilise un fichier clé, comme ceci:

    <sshsession Host="xxxx"
    username="xxxx"
    keyfile="/Users/xxxx/.ssh/id_dsa"
    passphrase="xxxx">
      <LocalTunnel lport="1080" rhost="xxxx" rport="80"/>
      <sequential>
        <get src="http://localhost:1080/xxxx" dest="/tmp/xxxx"/>
      </sequential>
    </sshsession>

Je reçois cette exception:

/tmp/build.xml:8: com.jcraft.jsch.JSchException: Auth cancel
    at com.jcraft.jsch.Session.connect(Session.Java:451)
    at com.jcraft.jsch.Session.connect(Session.Java:150)
    at org.Apache.tools.ant.taskdefs.optional.ssh.SSHBase.openSession(SSHBase.Java:223)
  • Je suis sûr que j'utilise le bon fichier de clés (j'ai essayé d'utiliser le mauvais nom, ce qui donne une FileNotFoundException légitime).
  • Je peux réussir ssh à partir de la ligne de commande sans être invité à saisir un mot de passe.
  • Je suis sûr que j'utilise la phrase de passe correcte pour le fichier de clés.

Quelle est la cause de cette erreur et que puis-je faire?

20
Dan Fabulich

J'ai débogué le code. Cela échouait car ma clé privée échouait à l'authentification; JSch est revenu silencieusement à l'authentification par mot de passe, qui a été annulée, car je n'ai pas spécifié de mot de passe.

La gestion des erreurs JSch craint beaucoup. Revenez sur vos pas, régénérez un fichier de clé privée (séparé), utilisez ssh -i pour garantir que vous utilisez le bon fichier et croisez les doigts.

36
Dan Fabulich

Pour que la connexion jsch fonctionne, vous devez spécifier les chemins d'accès aux known_hosts et vers le fichier contenant la clé privée. Cela se fait à l'aide des méthodes setKnownHosts et addIdentity.

        jsch.setKnownHosts("/path/to/.ssh/known_hosts");
        jsch.addIdentity("/path/to/.ssh/id_rsa");

Si la clé a une phrase secrète, vous pouvez l'ajouter à la liste d'arguments addIdentity:

        jsch.addIdentity("/path/to/.ssh/id_rsa", myPassPhrase);

Voir Javadocs

5
Oscar Bravo

J'ai eu le même problème lors de l'utilisation de la tâche sshexec. J'ai également ajouté l'attribut de phrase secrète et cela a bien fonctionné. créez une phrase secrète pour votre clé privée et ajoutez-la en tant qu'attribut dans votre tâche. N'oubliez pas non plus de convertir votre clé privée au format ssh ouvert si vous avez généré la clé à l'aide de puttygen sur Windows.

3
cnu

J'ai eu un problème similaire aujourd'hui. J'ai donc pensé partager ma solution également. J'ai eu la même exception mais le problème était en fait que j'avais un tréma dans mon mot de passe. après avoir choisi un nouveau mot de passe sans tout, tout a bien fonctionné.

1
kukudas

Il y a maintenant une toute nouvelle fourchette de Jsch. La gestion des exceptions est beaucoup plus complète. Plus de déglutition ou de défaut. Rendez-vous sur https://github.com/vngx/vngx-jsch pour le vérifier. Si quelque chose ne fonctionne pas comme prévu, veuillez le signaler comme un problème ou envoyer une demande d'extraction car nous la maintenons activement. Nous cherchons également à le mettre bientôt sur les dépôts centraux maven.

0
Scott