从 .pub 格式的 public 密钥创建 JSch HostKey 实例

Creating JSch HostKey instance from a public key in .pub format

我正在尝试使用 JSch 将文件从 Windows 机器发送到 Linux 机器。因此,我将主机 public 密钥从 Linux 机器复制到我的 Windows 机器并将密钥添加到我的 HostKeyRepository。但出于某种原因,我得到 "invalid key type" 异常。这是我的代码:

HostKeyRepository repo = jsch.getHostKeyRepository();
File file = new File("D:\Uni\Arbeit\ssh_host_rsa_key.pub");
byte[] HK = Files.readAllBytes(file.toPath());
Session session=jsch.getSession(user, host, 22);
session.setPassword(password);  
HostKey hk = new HostKey(null, HK); 
repo.add(hk, null);
session.connect();

.pub 文件的格式为:

<type> <base64-encoded-public-key> <comment>

进入 HostKey constructor 的只是 public 关键部分,以二进制形式(不是 base64 编码)。

使用 JSch Util.fromBase64()base64-encoded-public-key 部分转换为 byte[]

static byte[] fromBase64(byte[] buf, int start, int length) 

您还可以在 KnownHosts.setKnownHosts(InputStream input).

中检查 known_hosts 文件解析的 JSch 实现

known_hosts文件的格式与.pub文件类似,只是前面多了一个hostname部分,通常不包括comment :

<hostname> <type> <base64-encoded-public-key> [comment]

请注意,如果您知道要解析文件的一种特定格式,则您的实现不必像他们那样复杂。


所以从 File 读取行到字符串,删除 <type><comment> 并使用这个表达式(取自 KnownHosts.setKnownHosts,关键是 <base64-encoded-public-key>部分):

Util.fromBase64(Util.str2byte(key), 0, key.length())