Apache MINA SSHD:如何实例化KnownHostsServerKeyVerifier并传入known_hosts?
Apache MINA SSHD 使用 known_hosts 验证远程主机身份
关于 KnownHostsServerKeyVerifier 的 delegate 参数
delegate 是可选的备用验证器:
- 当目标主机的密钥不在
known_hosts文件中,或密钥不匹配时,SSHD 会调用该delegate的验证逻辑。 - 若不需要额外备用验证,直接传
null即可。此时如果主机密钥不在known_hosts或不匹配,默认会拒绝连接并抛出HostKeyException。
如果需要自定义未知主机的处理逻辑(比如模拟 OpenSSH 的交互确认),可以自己实现 ServerKeyVerifier 作为 delegate:
ServerKeyVerifier customDelegate = (session, host, serverKey) -> { // 自定义验证逻辑:比如控制台询问用户是否信任未知主机 String fingerprint = FingerprintGenerator.getDefault().computeFingerprint(serverKey); System.out.printf("发现未知主机 %s,密钥指纹:%s,是否信任?(y/n)", host, fingerprint); Scanner scanner = new Scanner(System.in); return "y".equalsIgnoreCase(scanner.nextLine()); }; // 传入自定义 delegate 和 known_hosts 路径 ServerKeyVerifier verifier = new KnownHostsServerKeyVerifier(customDelegate, Paths.get("/path/to/known_hosts")); client.setServerKeyVerifier(verifier);
更简洁的实现方式:直接使用 SshClient.loadKnownHosts()
SSHD 提供了更简便的方法加载 known_hosts,无需手动创建 KnownHostsServerKeyVerifier:
SshClient client = SshClient.setUpDefaultClient(); // 加载指定路径的 known_hosts 文件 client.loadKnownHosts(Paths.get("/path/to/known_hosts")); // 后续连接逻辑 client.start(); try (ClientSession session = client.connect("username", "host", 22).verify().getSession()) { session.addPasswordIdentity("password"); session.auth().verify(); // 执行具体操作 } finally { client.stop(); }
这个方法会自动创建并设置 KnownHostsServerKeyVerifier,内部默认 delegate 为拒绝未知主机,和传 null 的效果一致。
补充说明
- 如果
known_hosts位于用户主目录的默认路径(如~/.ssh/known_hosts),直接调用无参的client.loadKnownHosts()即可,它会自动读取默认路径的文件。 known_hosts文件需兼容 OpenSSH 格式,SSHD 支持标准格式(包括哈希化主机名的格式)。
内容的提问来源于stack exchange,提问作者Sumeet Ambastha
相关产品推荐
相关产品推荐

