2013-03-11 9 views
13

Ich verwende JDK 1.7 & Windows 7 mit Netbeans 7.2 Ich habe ein SSH private & öffentlichen Schlüsselpaar (SSH2-2048 Bits) mit Putty-Keygen generiert. Ich habe kein Passwort für den privaten Schlüssel. Ich versuche jetzt mit SFTP eine Verbindung zu einem der Host-Rechner herzustellen. Aber wenn ich den privaten Schlüssel (ppk) übergebe, um die Identität festzulegen, gibt der Code einen ungültigen privaten Schlüsselfehler zurück. Ich benutzte denselben privaten Schlüssel in WinSCP, um mit demselben Wirt zu verbinden & es funktioniert gut. Bitte helfen Sie mir, den Fehler zu beheben. Hier ist mein Code:JSCH - Ungültiger privater Schlüssel

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(); 
} 
+0

bitte fügen Sie die Print-Stack-Spur in den Beitrag ein – Visruth

Antwort

24

Ich glaube, dass der Schlüssel nicht in OpenSSH Schlüssel-Dateiformat ist. JSch erwartet, dass der private Schlüssel im OpenSSH-Format vorliegt.

können Sie PuTTYgen benutzen, um Ihre privaten Schlüssel zu konvertieren, indem Sie die Schritte mit OpenSSH arbeiten here beschrieben:

  1. Drücken Laden und wählen Sie den privaten Schlüssel, mit PuTTYgen erstellt wurde.
  2. Geben Sie die Passphrase ein, um den Schlüssel zu laden.
  3. Von den Conversions Menü wählen Export OpenSSH Schlüssel
  4. Speichern Sie den privaten Schlüssel.
+0

Vielen Dank für Ihre Antwort. Nach der Konvertierung zu OpenSSH (mit Ihren Schritten), kann ich eine Verbindung zum Server herstellen. Vielen Dank für Ihre Unterstützung. –

+0

@gerganov Kann JSch das Lesen des privaten Schlüssels im SSH2-Format unterstützen? – yapkm01

+0

Sie haben meinen Tag gerettet! JSch benötigt den privaten Schlüssel im OpenSSH-Schlüsseldateiformat. – user1561521

2

Der folgende Beispielcode kann Ihnen helfen.

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; 
    } 
} 

Um ein Verzeichnis zu machen:

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(); 
} 
0

Sie können PEMWriter benutzen, um Ihre privaten Schlüssel in PEM-Format zu konvertieren, das

Das folgende Beispiel von JSch akzeptiert werden konvertiert einen Schlüssel zurückgegeben von Java-Schlüsselspeicher (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(); 
1

Vielleicht nicht eine Lösung für Sie, aber ich habe diese Frage gefunden, als ich nach meinem Problem gesucht habe.

Ich hatte versehentlich den Pfad zu der öffentlichen Schlüsseldatei angegeben, als JSCH die private Schlüsseldatei erwartete.

+0

eine sehr relevante Beobachtung. Das war auch mein Fall. –