Рубрики
Без рубрики

JSch – недопустимое исключение частного ключа

Для исключения недопустимого закрытого ключа Jsch попробуйте `ssh-keygen”, чтобы преобразовать закрытый ключ в другой формат.

Этот пример Java пытается использовать JSch для передачи файла из локальной папки на удаленный сервер с использованием открытого и закрытого ключей вместо пароля.

  
     com.jcraft
     jsch
     0.1.55
  
package com.mkyong.io.howto;

import com.jcraft.jsch.*;

public class SFTPFileTransfer {

    private static final String REMOTE_HOST = "1.1.1.1";
    private static final String USERNAME = "";
    private static final int REMOTE_PORT = 22;

    public static void main(String[] args) {

        String localFile = "/home/mkyong/Test.java";
        String remoteFile = "/home/mkyong/test/Test2.java";

        Session jschSession = null;

        try {

            JSch jsch = new JSch();
            jsch.setKnownHosts("/home/mkyong/.ssh/known_hosts");
            jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT);

            // private key location
            jsch.addIdentity("/home/mkyong/.ssh/id_rsa");

            jschSession.connect(10000);

            Channel sftp = jschSession.openChannel("sftp");

            sftp.connect(5000);

            ChannelSftp channelSftp = (ChannelSftp) sftp;

            // transfer file from local to remote server
            channelSftp.put(localFile, remoteFile);

            channelSftp.exit();

        } catch (JSchException | SftpException e) {

            e.printStackTrace();

        } finally {
            if (jschSession != null) {
                jschSession.disconnect();
            }
        }

        System.out.println("Done");
    }

}

Но это вызывает исключение недопустимый закрытый ключ .

com.jcraft.jsch.JSchException: invalid privatekey: [B@1324409e
	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:406)
	at com.jcraft.jsch.JSch.addIdentity(JSch.java:366)
	at com.mkyong.io.howto.SFTPFileTransfer.main(SFTPFileTransfer.java:31)

1. кошка/дом/мкйонг/.ssh/id_rsa

Проверьте закрытый ключ, и он выглядит примерно так:

$ cat /home/mkyong/.ssh/id_rsa

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC...
...
...
...MAECAwQF
-----END OPENSSH PRIVATE KEY-----

2. Решение

Jsch, похоже, не поддерживает указанный выше формат закрытого ключа, для его решения мы можем использовать ssh-keygen для преобразования формата закрытого ключа в RSA или режим pem , и вышеуказанная программа снова заработает.

$ ssh-keygen -p -f ~/.ssh/id_rsa -m pem

Перепроверьте содержимое закрытого ключа, оно должно начинаться с BEGIN RSA .

$ cat /home/mkyong/.ssh/id_rsa

-----BEGIN RSA PRIVATE KEY-----
MIIG4wIBAAK...
...
...
...E428GBDI4
-----END RSA PRIVATE KEY-----

Рекомендации

Оригинал: “https://mkyong.com/java/jsch-invalid-privatekey-exception/”