使用 Java 检索远程 SSH 服务器的主机密钥
Retrieving host key of remote SSH server using Java
我希望能够使用 Java 代码检索远程 SSH 主机的主机密钥。是否有任何库可以执行此操作,我查看了 JSch 但找不到我想要的东西。
我知道我可以通过 Java 运行 终端命令 ssh-keyscan <hostname>
,但我希望这是最后的手段。寻求更好的解决方案。
使用 JSch,您可以这样做:
实施HostKeyRepository
interface in a way that the check
method stores its key
argument and the method returns NOT_INCLUDED
.
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
.
我希望能够使用 Java 代码检索远程 SSH 主机的主机密钥。是否有任何库可以执行此操作,我查看了 JSch 但找不到我想要的东西。
我知道我可以通过 Java 运行 终端命令 ssh-keyscan <hostname>
,但我希望这是最后的手段。寻求更好的解决方案。
使用 JSch,您可以这样做:
实施
HostKeyRepository
interface in a way that thecheck
method stores itskey
argument and the method returnsNOT_INCLUDED
.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
.