【发布时间】:2022-01-26 10:34:17
【问题描述】:
虽然sshj的github里有例子,但是不明白自己在做什么。我使用以下代码尝试连接到我的主机,就是这样
@Test
public void sshTest() throws IOException {
SSHClient client = new SSHClient();
String username = "username";
File privateKey = new File("D:\\SSH\\remote_new");
client.addHostKeyVerifier(new PromiscuousVerifier());
client.connect("myMostIp", 22);
KeyProvider keys = client.loadKeys(privateKey.getPath());
client.authPublickey(username, keys);
client.close();
}
运行的结果是这样的
net.schmizz.sshj.userauth.UserAuthException: Exhausted available authentication methods
Caused by: net.schmizz.sshj.userauth.UserAuthException: Problem getting public key from PKCS8KeyFile{resource=[PrivateKeyFileResource] D:\SSH\matcloud_new}
... 66 more
Caused by: java.io.IOException: unrecognised object: OPENSSH PRIVATE KEY
at org.bouncycastle.openssl.PEMParser.readObject(Unknown Source)
... 71 more
密钥文件的格式
-----BEGIN OPENSSH PRIVATE KEY-----
XXXXXXXXX
-----END OPENSSH PRIVATE KEY-----
不知道怎么办,jsch不支持这种格式的key文件
【问题讨论】:
-
什么版本的 sshj?根据 github 上的 README,sshj(与 jsch 不同,尽管两者都实现了 SSH)自 0.19.0 2016-11-25 起支持 Ed25519 的 OpenSSH-newformat 文件,自 0.27.0 2019-01-24 起支持其他密钥类型
-
我用的是最新的0.10.0版本,但是问题是我用sshj的时候连密码都登录不了。
-
0.10.0 不是最新版本,而是从 2014 年开始的。如果主机允许密码验证(并非所有人都这样做)使用它,您需要调用
.authPassword()方法之一。 -
那么最新的版本是什么?使用jsch的时候,可以通过密码正常连接,但是不能通过sshj。 jsch不支持新版openssh密钥格式
-
The most recent release is 0.30.0 虽然正如我之前所说的 0.27.0(从 2 年前开始)或更高版本应该完全支持 OpenSSH-newfmt 文件。