You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 10:42:47