使用 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
    }
    
  • 致电JSch.setHostKeyRepository.

  • 开始与服务器的连接。您的 HostKeyRepository.check 实现将使用服务器的主机密钥调用。连接不会发生,因为方法返回 NOT_INCLUDED.


但请确保您了解自己在做什么。只有当您想要保留主机密钥以供将来参考时,这才有意义。不要试图以这种方式绕过或自动执行主机密钥检查。您将失去针对 MITM attacks.

的保护

如果您打算保留主机密钥,请考虑为此使用定义明确的机制,即 known_hosts 文件。 JSch 可以读取和更新它,您不必显式实现它。

此外,如果您的目标是允许用户检查主机密钥,JSch 也有一个机制,设置 StrictHostKeyChecking=ask 并实现 UserInfo.promptYesNo.