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

Bra*_*ave 3 java jsch public-key

我正在尝试使用 JSch 将文件从 Windows 机器发送到 Linux 机器。因此,我将主机公钥从 Linux 机器复制到我的 Windows 机器,并将密钥添加到我的HostKeyRepository. 但由于某种原因,我收到“无效的密钥类型”异常。这是我的代码:

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();
Run Code Online (Sandbox Code Playgroud)

Mar*_*ryl 6

.pub文件具有以下格式:

<type> <base64-encoded-public-key> <comment>
Run Code Online (Sandbox Code Playgroud)

进入HostKey构造函数的只是公钥部分,以二进制形式(非 base64 编码)。

使用 JSchUtil.fromBase64()base64-encoded-public-key部件转换为byte[].

static byte[] fromBase64(byte[] buf, int start, int length) 
Run Code Online (Sandbox Code Playgroud)

您还可以known_hostsKnownHosts.setKnownHosts(InputStream input).

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

static byte[] fromBase64(byte[] buf, int start, int length) 
Run Code Online (Sandbox Code Playgroud)

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


因此,从Fileto 字符串读取行,删除<type>and<comment>并使用此表达式(取自KnownHosts.setKnownHosts,关键是<base64-encoded-public-key>部分):

Util.fromBase64(Util.str2byte(key), 0, key.length())
Run Code Online (Sandbox Code Playgroud)