АОН - Недействительный закрытый ключ
Я запускаю JDK 1.7 и Windows 7 с использованием netbeans 7.2
Я создал SSH частную и открытую пару ключей (SSH2-2048 бит), используя putty-keygen. У меня нет пароля для закрытого ключа.
Теперь я пытаюсь подключиться к одной из хост-машин, используя 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();
}
Ответы
Ответ 1
Я предполагаю, что ваш ключ не в формате файла OpenSSH. JSch ожидает, что закрытый ключ будет в формате OpenSSH.
Вы можете использовать PuTTYgen для преобразования вашего закрытого ключа для работы с OpenSSH, выполнив следующие шаги здесь:
- Нажмите "Загрузить" и выберите "Закрытый ключ", который был создан с помощью
PuTTYgen.
- Введите ключевую фразу для загрузки ключа.
- Из конверсий
меню выберите экспорт ключа OpenSSH
- Сохранить закрытый ключ.
Ответ 2
Следующий пример кода может помочь вам.
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;
}
}
Сделать каталог:
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();
}
Ответ 3
Возможно, это не решение для вас, но я нашел этот вопрос, когда искал свою проблему.
Я случайно дал путь к публичному ключевому файлу, когда АОH ожидал закрытый ключевой файл.
Ответ 4
Вы можете использовать PEMWriter для преобразования вашего закрытого ключа в формат PEM, который будет принят JSch
Следующий пример преобразует ключ, возвращенный из 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();
Ответ 5
Я тоже наткнулся на эту проблему. при запуске Jgit на Mac для некоторых пользователей мы видели следующее исключение:
org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:160)
at org.eclipse.jgit.transport.SshTransport.getSession(SshTransport.java:137)
at org.eclipse.jgit.transport.TransportGitSsh$SshFetchConnection.<init>(TransportGitSsh.java:274)
at org.eclipse.jgit.transport.TransportGitSsh.openFetch(TransportGitSsh.java:169)
at org.eclipse.jgit.transport.FetchProcess.executeImp(FetchProcess.java:136)
at org.eclipse.jgit.transport.FetchProcess.execute(FetchProcess.java:122)
at org.eclipse.jgit.transport.Transport.fetch(Transport.java:1236)
at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:234)
... 17 more
Caused by: com.jcraft.jsch.JSchException: invalid privatekey: [[email protected]
at com.jcraft.jsch.KeyPair.load(KeyPair.java:664)
at com.jcraft.jsch.KeyPair.load(KeyPair.java:561)
at com.jcraft.jsch.IdentityFile.newInstance(IdentityFile.java:40)
at com.jcraft.jsch.JSch.addIdentity(JSch.java:407)
at com.jcraft.jsch.JSch.addIdentity(JSch.java:367)
at org.eclipse.jgit.transport.JschConfigSessionFactory.getJSch(JschConfigSessionFactory.java:276)
at org.eclipse.jgit.transport.JschConfigSessionFactory.createSession(JschConfigSessionFactory.java:220)
at org.eclipse.jgit.transport.JschConfigSessionFactory.createSession(JschConfigSessionFactory.java:176)
at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:110)
Основной причиной было обнаружено несоответствие закрытого ключа ssh. Исключение произошло только для пользователей с ключом более нового вида ed25519, который выводит этот заголовок ключа:
-----BEGIN OPENSSH PRIVATE KEY-----
вместо доброго RSA:
-----BEGIN RSA PRIVATE KEY-----
регенерация ключа RSA (ssh-keygen -t rsa
), исключение исключено