【发布时间】:2021-09-08 16:14:32
【问题描述】:
我希望能够使用 Java 代码检索远程 SSH 主机的主机密钥。有没有这样做的库,我查看了 JSch 但找不到我想要的。
我知道我可以通过 Java 运行终端命令 ssh-keyscan <hostname>,但我希望这是最后的手段。寻求更好的解决方案。
【问题讨论】:
我希望能够使用 Java 代码检索远程 SSH 主机的主机密钥。有没有这样做的库,我查看了 JSch 但找不到我想要的。
我知道我可以通过 Java 运行终端命令 ssh-keyscan <hostname>,但我希望这是最后的手段。寻求更好的解决方案。
【问题讨论】:
使用 JSch,您可以这样做:
以check 方法存储其key 参数并且该方法返回NOT_INCLUDED 的方式实现HostKeyRepository interface。
public class HostKeyStore implements HostKeyRepository
{
public byte[] key;
int check(String host, byte[] key)
{
this.key = key;
return NOT_INCLUDED;
}
// dummy implementations of the other methods
}
开始与服务器的连接。您的HostKeyRepository.check 实现将使用服务器的主机密钥调用。并且连接不会发生,因为方法返回了NOT_INCLUDED。
但请确保您了解自己在做什么。仅当您想保留主机密钥以供将来参考时,这才有意义。不要尝试以这种方式绕过或自动执行主机密钥检查。您将失去对MITM attacks 的保护。
如果您的目标是保留主机密钥,请考虑为此使用明确定义的机制,即known_hosts 文件。 JSch 可以读取和更新它,你不必显式地实现它。
另外,如果你的目标是允许用户检查主机密钥,JSch 也有一个机制,设置StrictHostKeyChecking=ask 并实现UserInfo.promptYesNo。
【讨论】: