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)
该.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_hosts在KnownHosts.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)