Проблема с закрытым ключом RSA SSH2 с использованием Jsch и Sshj в Java

Здесь я пытаюсь подключиться к удаленной машине для передачи файлов через SFTP. Мы используем аутентификацию на основе RSA SSH2 key при подключении к удаленному компьютеру.

Я пытался сделать это в двух подходах ниже, у меня возникли проблемы с обоими подходами.

Подход 1: использование JSCH

JSch jSch = new JSch();
Session session=jSch.getSession(SFTPUSER,SFTPHOST,SFTPPORT);

//This is only for dev server in production will be removed
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);

//Facing issue with the below statement
jSch.addIdentity("/home/jbadmin/.ssh2/id_rsa_2048_a");

session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();

-----------------
-----------------
if(channel!=null) channel.disconnect(); 
if(session!=null) session.disconnect();

Исключение:

com.jcraft.jsch.JSchException: invalid privatekey: [B@8c38a2
at com.jcraft.jsch.KeyPair.load(KeyPair.java:747)
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)

Подход 2: использование SSHJ

SSHClient ssh = new SSHClient(); 
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
ssh.addHostKeyVerifier(new PromiscuousVerifier());
ssh.connect(SFTPHOST,SFTPPORT);

//Facing issue with below statements
OpenSSHKeyFile sshKeyFile = new OpenSSHKeyFile();
sshKeyFile.init("/home/jbadmin/.ssh2/id_rsa_2048_a");
ssh.authPublickey(SFTPUSER,sshKeyFile);

SFTPClient sftp = ssh.newSFTPClient();

-------------------------------------
-------------------------------------
sftp.close();
ssh.disconnect();
ssh.close();

Исключение (без использования BouncyCastle):

INFO  [net.schmizz.sshj.common.SecurityUtils] (http-localhost/127.0.0.1:8080-6) BouncyCastle not registered, using the default JCE provider
WARN  [net.schmizz.sshj.DefaultConfig] (http-localhost/127.0.0.1:8080-6) Disabling high-strength ciphers: cipher strengths apparently limited by JCE policy
INFO  [net.schmizz.sshj.transport.TransportImpl] (http-localhost/127.0.0.1:8080-6) Client identity string: SSH-2.0-SSHJ_0
$cat id_rsa_2048_a.pub
---- BEGIN SSH2 PUBLIC KEY ----
Subject: xxxxxx
Comment: "2048-bit rsa, xxxxx@xxxxxxx, Tue Dec 29 2015 11:38:\47 +0800"
---------------------
---------------------
---- END SSH2 PUBLIC KEY ----
0 INFO [net.schmizz.sshj.transport.TransportImpl] (http-localhost/127.0.0.1:8080-6) Server identity string: SSH-2.0-6.4.6.215 SSH Tectia Server WARN [net.schmizz.sshj.userauth.keyprovider.OpenSSHKeyFile] (http-localhost/127.0.0.1:8080-6) Error reading public key: net.schmizz.sshj.common.Buffer$BufferException: Underflow INFO [net.schmizz.sshj.transport.TransportImpl] (http-localhost/127.0.0.1:8080-6) Disconnected - BY_APPLICATION ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/sgiserve].[mvc]] (http-localhost/127.0.0.1:8080-6) JBWEB000236: Servlet.service() for servlet mvc threw exception: java.lang.VerifyError: (class: org/bouncycastle/openssl/PEMReader$EncryptedPrivateKeyParser, method: parseObject signature: (Lorg/bouncycastle/util/io/pem/PemObject;)Ljava/lang/Object;) Incompatible argument to function at org.bouncycastle.openssl.PEMReader.<init>(Unknown Source) [bcpkix-jdk15on-1.49.jar:1.49.0] at org.bouncycastle.openssl.PEMReader.<init>(Unknown Source) [bcpkix-jdk15on-1.49.jar:1.49.0] at org.bouncycastle.openssl.PEMReader.<init>(Unknown Source) [bcpkix-jdk15on-1.49.jar:1.49.0] at net.schmizz.sshj.userauth.keyprovider.PKCS8KeyFile.readKeyPair(PKCS8KeyFile.java:128) [sshj-0.9.0.jar:] at net.schmizz.sshj.userauth.keyprovider.PKCS8KeyFile.getPublic(PKCS8KeyFile.java:72) [sshj-0.9.0.jar:] at net.schmizz.sshj.userauth.keyprovider.OpenSSHKeyFile.getPublic(OpenSSHKeyFile.java:60) [sshj-0.9.0.jar:] at net.schmizz.sshj.userauth.method.KeyedAuthMethod.putPubKey(KeyedAuthMethod.java:44) [sshj-0.9.0.jar:] at net.schmizz.sshj.userauth.method.AuthPublickey.buildReq(AuthPublickey.java:62) [sshj-0.9.0.jar:] at net.schmizz.sshj.userauth.method.AuthPublickey.buildReq(AuthPublickey.java:81) [sshj-0.9.0.jar:] at net.schmizz.sshj.userauth.method.AbstractAuthMethod.request(AbstractAuthMethod.java:63) [sshj-0.9.0.jar:] at net.schmizz.sshj.userauth.UserAuthImpl.authenticate(UserAuthImpl.java:68) [sshj-0.9.0.jar:] at net.schmizz.sshj.SSHClient.auth(SSHClient.java:211) [sshj-0.9.0.jar:] at net.schmizz.sshj.SSHClient.authPublickey(SSHClient.java:316) [sshj-0.9.0.jar:] at net.schmizz.sshj.SSHClient.authPublickey(SSHClient.java:335) [sshj-0.9.0.jar:]

Исключение (с использованием BouncyCastle):

INFO  [net.schmizz.sshj.common.SecurityUtils] (http-/10.92.141.78:28080-1) BouncyCastle already registered as a JCE provider
WARN  [net.schmizz.sshj.DefaultConfig] (http-/10.92.141.78:28080-1) Disabling high-strength ciphers: cipher strengths apparently limited by JCE policy
INFO  [net.schmizz.sshj.transport.TransportImpl] (http-/10.92.141.78:28080-1) Client identity string: SSH-2.0-SSHJ_0
$cat id_rsa_2048_a.pub
---- BEGIN SSH2 PUBLIC KEY ----
Subject: xxxxxx
Comment: "2048-bit rsa, xxxxx@xxxxxxx, Tue Dec 29 2015 11:38:\47 +0800"
---------------------
---------------------
---- END SSH2 PUBLIC KEY ----
0 INFO [net.schmizz.sshj.transport.TransportImpl] (http-/10.92.141.78:28080-1) Server identity string: SSH-2.0-6.4.6.215 SSH Tectia Server ERROR [net.schmizz.sshj.transport.TransportImpl] (reader) Dying because - {}: net.schmizz.sshj.transport.TransportException: Unable to reach a settlement: [] and [aes256-cbc, aes192-cbc, aes128-cbc, aes256-ctr, aes192-ctr, aes128-ctr, 3des-cbc, [email protected]] at net.schmizz.sshj.transport.Proposal.firstMatch(Proposal.java:165) [sshj-0.9.0.jar:] at net.schmizz.sshj.transport.Proposal.negotiate(Proposal.java:147) [sshj-0.9.0.jar:] at net.schmizz.sshj.transport.KeyExchanger.gotKexInit(KeyExchanger.java:239) [sshj-0.9.0.jar:]

Мой закрытый ключ (id_rsa_2048_a):

$ cat id_rsa_2048_a
---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----
Subject: xxxxx
Comment: "2048-bit rsa, xxxxx@xxxxx, Tue Dec 29 2015 11:38:\47 +0800"
------------------------
------------------------
---- END SSH2 ENCRYPTED PRIVATE KEY ----

Мой открытый ключ (id_rsa_2048_a.pub):

$cat id_rsa_2048_a.pub
---- BEGIN SSH2 PUBLIC KEY ----
Subject: xxxxxx
Comment: "2048-bit rsa, xxxxx@xxxxxxx, Tue Dec 29 2015 11:38:\47 +0800"
---------------------
---------------------
---- END SSH2 PUBLIC KEY ----

файл авторизации:

key gwf.id_dsa_2048_a.pub
key id_rsa_2048_a.pub

Я не уверен, связана ли проблема с моим private key или с тем, как я реализовал, мы уже поделились нашим public key с удаленной машиной. используя шпатлевку, мы можем передать файл на удаленную машину, используя SCP.


person Uppicharla    schedule 31.12.2015    source источник
comment
Как вы сгенерировали файлы закрытых ключей, которые вы здесь используете?   -  person Kenster    schedule 02.01.2016
comment
Мой системный администратор создал ключи с помощью ssh-keygen-g3. .   -  person Uppicharla    schedule 03.01.2016


Ответы (2)


Кажется, вы не загрузили криптографию неограниченной силы для JVM.

WARN  [net.schmizz.sshj.DefaultConfig] (http-/10.92.141.78:28080-1) Disabling high-strength ciphers: cipher strengths apparently limited by JCE policy

Пожалуйста, загрузите Java Cryptography Extensions для вашей JVM, чтобы разрешить использование высоконадежных шифров и ключей.

person Hiery Nomus    schedule 13.04.2016

У меня была похожая проблема, возможно, ваш существующий закрытый ключ не использует открытый формат SSH. Мое решение состояло в том, чтобы преобразовать существующий файл закрытого ключа с помощью следующей команды:

ssh-keygen -i -f id_rsa_2048_a > id_rsa_2048_a_opensshformat

Ho

person Homer    schedule 02.06.2016