JSCH – 无效的私钥

我使用netbeans 7.2运行JDK 1.7和Windows 7.我使用putty-keygen生成了一个SSH私钥和公钥对(SSH2-2048位)。 私钥没有任何密码。 我现在正尝试使用SFTP连接到其中一台主机。 但是当我传递私钥(ppk)来设置Identity时,代码返回无效的私钥错误。 我在WinSCP中使用相同的私钥连接到同一主机,它工作正常。 请帮我解决错误。 这是我的代码:

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

我猜你的密钥不是OpenSSH密钥文件格式。 JSch希望私钥是OpenSSH格式。

您可以按照此处描述的步骤使用PuTTYgen转换您的私钥以使用OpenSSH:

  1. 按Load并选择使用PuTTYgen创建的私钥。
  2. 输入密码以加载密钥。
  3. 从“转换”菜单中选择导出OpenSSH键
  4. 保存私钥。

也许不是你的解决方案,但是当我搜索我的问题时,我发现了这个问题。

当JSCH期望私钥文件时,我不小心给出了公钥文件的路径。

以下示例代码可以帮助您。

 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 lines = new ArrayList(); 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 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 lines = new ArrayList(); 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 

制作目录:

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

您可以使用PEMWriter将您的私钥转换为JSch将接受的PEM格式

以下示例转换从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();