web-dev-qa-db-fra.com

JSCH - Clé privée invalide

J'utilise JDK 1.7 et Windows 7 avec Netbeans 7.2 J'ai généré une paire de clés publique et privée SSH (SSH2-2048 bits) à l'aide de PuTTY-keygen. Je n'ai pas de mot de passe pour la clé privée . J'essaie maintenant de me connecter à l'un des ordinateurs hôtes à l'aide de SFTP. Mais lorsque je passe la clé privée (ppk) pour définir Identity, le code renvoie une erreur de clé privée non valide. J'ai utilisé la même clé privée dans WinSCP pour me connecter au même hôte et tout fonctionne correctement. Veuillez m'aider à résoudre l'erreur . Voici mon code:

JSch jsch = new JSch();

Session session = null;

try {

    jsch.addIdentity("D:\\TEMP\\key.ppk");

    session = jsch.getSession("tiabscp", "ssiw.support.qvalent.com", 22);
    session.setConfig("StrictHostKeyChecking", "no");
    //session.setPassword("");
    session.connect();
    Channel channel = session.openChannel("sftp");
    System.out.println("Getting connected");
    channel.connect();
    System.out.println("connected successfully");
    ChannelSftp sftpChannel = (ChannelSftp) channel;
    sftpChannel.get("remotefile.txt", "localfile.txt");
    sftpChannel.exit();
    session.disconnect();
}catch (JSchException e) {

    e.printStackTrace();

}catch (SftpException e) {

    e.printStackTrace();
}
13

Je suppose que votre clé n'est pas au format de fichier OpenSSH. JSch s'attend à ce que la clé privée soit au format OpenSSH.

Vous pouvez utiliser PuTTYgen pour convertir votre clé privée pour qu’elle fonctionne avec OpenSSH en suivant les étapes décrites ici :

  1. Appuyez sur Charger et sélectionnez la clé privée créée avec PuTTYgen.
  2. Entrez la phrase secrète pour charger la clé.
  3. Dans le menu Conversionsmenu, sélectionnez Export OpenSSH key
  4. Enregistrez la clé privée.
29
rgerganov

Peut-être pas une solution pour vous, mais j'ai trouvé cette question lorsque j'ai cherché mon problème.

J'avais accidentellement donné le chemin au fichier de clé publique lorsque JSCH attendait le fichier de clé privée.

4
jontejj

L'exemple de code suivant peut vous aider.

package ssh.control;

import Java.io.BufferedReader;
import Java.io.ByteArrayOutputStream;
import Java.io.InputStreamReader;
import Java.util.ArrayList;
import Java.util.List;
import Java.util.Properties;

import Android.util.Log;

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


public class SSHConnections {
    static String user="";
    static String pass="";
    static String ip="";


    static Session session;

    public static ChannelExec getChannelExec() throws Exception{
        //System.out.println("connected");
        //This class serves as a central configuration point, and as a factory for Session objects configured with these settings.
        JSch jsch = new JSch();
        //A Session represents a connection to a SSH server.
        session = jsch.getSession(user, ip, 22);
        //getSession()   :-  the session to which this channel belongs. 
        session.setPassword(pass);

        // Avoid asking for key confirmation
        //http://docs.Oracle.com/javase/1.4.2/docs/api/Java/util/Properties.html
        Properties prop = new Properties();
        prop.put("StrictHostKeyChecking", "no");


        //Sets multiple default configuration options at once. 
        session.setConfig(prop);

        session.connect();
        if(session.isConnected()) {
            System.out.println("connected");
        }

        // SSH Channel 
        //Opens a new channel of some type over this connection. 
        ChannelExec channelssh = (ChannelExec) session.openChannel("exec");

        return channelssh;
    }

    public static  String[] executeRemoteCommand(String command) throws Exception {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ChannelExec channelssh = SSHConnections.getChannelExec();
        channelssh.setOutputStream(baos);

        // Execute command
        channelssh.setCommand(command);//gedit tt
        InputStreamReader isr = new InputStreamReader(channelssh.getInputStream());

        BufferedReader bufred = new BufferedReader(isr);

        channelssh.connect();
        String s = bufred.readLine();

        List<String> lines = new ArrayList<String>();

        int count = 0;
        while( s!=null ) {
            //System.out.println(s);
            lines.add(count,s);
            //      filesandfolders[count]=s;
            //      System.out.println(filesandfolders[count]);
            s = bufred.readLine();  
            count++;
        }

        String filesandfolders[] = new String[count];

        for(int i = 0; i<count;i++) {
            filesandfolders[i] = lines.get(i);
            Log.d("filesandfolders[i]", filesandfolders[i]);
        }
        //for(int j=0;j<filesandfolders.length;j++) {
        //System.out.println(filesandfolders[j]);
        //}
        //System.out.println("lines is "+lines.get(0));
        //int a;
        //while((a = isr.read()) != -1)
        //System.out.print((char)a);
        //channelssh.disconnect();
        //return baos.toString();
        return filesandfolders;
    }

    public static  List<String> executeRemoteCommand1(String command) throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ChannelExec channelssh=SSHConnections.getChannelExec();
        channelssh.setOutputStream(baos);

        // Execute command
        channelssh.setCommand(command);//gedit tt
        InputStreamReader isr = new InputStreamReader(channelssh.getInputStream());

        BufferedReader bufred = new BufferedReader(isr);

        channelssh.connect();
        String s = bufred.readLine();

        List<String> lines = new ArrayList<String>();

        int count=0;
        while(s != null) {
            //System.out.println(s);
            lines.add(count, s);
            //      filesandfolders[count] = s;
            //      System.out.println(filesandfolders[count]);
            s = bufred.readLine();  
            count++;
        }

        String filesandfolders[] = new String[count];

        for(int i=0; i<count;i++) {
            filesandfolders[i]=lines.get(i);
        }
        //for(int j=0;j<filesandfolders.length;j++) {
        //System.out.println(filesandfolders[j]);
        //}
        //System.out.println("lines is "+lines.get(0));
        //int a;
        //while((a = isr.read()) != -1)
        //System.out.print((char)a);
        //channelssh.disconnect();
        //return baos.toString();
        return lines;
    }
}

Pour créer un répertoire:

SSHConnections.user = "username";
SSHConnections.ip = "192.168.1.102";
SSHConnections.pass = "mypassword";
ChannelExec channelssh = SSHConnections.getChannelExec();

String dirname = "sampledirectory";
try {
    String[] str = SSHConnections.executeRemoteCommand("mkdir "+dirname);
} catch (Exception e) {
    e.printStackTrace();
}
2
Visruth

Vous pouvez utiliser PEMWriter pour convertir votre clé privée au format PEM qui sera accepté par JSch.

L'exemple suivant convertit une clé renvoyée à partir de Java KeyStore (JKS)

Key privateKey = KeyStore.getKey(privateKeyAlias, keyStorePassword);//get key from JKS
StringWriter stringWriter = new StringWriter();
PEMWriter pemWriter = new PEMWriter(stringWriter);
pemWriter.writeObject(privateKey);
pemWriter.close();

byte[] privateKeyPEM = stringWriter.toString().getBytes();
0
Abdelhameed Mahmoud