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

开启StrictHostKeyChecking后JSch连接VPS报UnknownHostKey错误问题求助

解决JSch启用StrictHostKeyChecking时UnknownHostKey异常

问题原因分析

你遇到的UnknownHostKey异常,本质是JSch在读取known_hosts文件时,找不到与目标IP匹配的有效主机密钥条目。可能的触发原因包括:

  • OpenSSH生成的known_hosts格式与JSch的解析逻辑存在细微差异(比如换行符、密钥算法标识处理)
  • JSch默认尝试反向解析IP对应的主机名,导致用主机名而非连接时的IP去匹配条目
  • 程序对known_hosts文件的读取权限不足,或者路径配置有误
  • 旧版本JSch对某些密钥算法的支持不完善

分步解决方案

1. 简化known_hosts文件读取方式

首先,尝试用JSch原生的文件路径读取方式替代FileInputStream,避免流读取时的编码或换行符问题:

try {
    // 直接传入文件路径字符串,而非InputStream
    SSH.setKnownHosts("C:/Users/nvulc/.ssh/known_hosts");
    SSH.addIdentity(keyPath, keyPass);
    Session session = SSH.getSession("root", "184.154.70.174", 22);
    
    // 禁用主机IP反向解析,强制用连接时的IP匹配known_hosts
    session.setConfig("CheckHostIP", "no");
    // 明确启用StrictHostKeyChecking(确保全局配置未覆盖此设置)
    session.setConfig("StrictHostKeyChecking", "yes");
    
    session.connect();
} catch (Exception e) {
    e.printStackTrace();
}

2. 确保JSch支持目标密钥算法

如果你的Debian服务器默认禁用了旧版RSA算法(虽然可能性较低),可以在Session中强制启用RSA相关算法:

session.setConfig("PubkeyAcceptedAlgorithms", "+ssh-rsa");
session.setConfig("HostKeyAlgorithms", "+ssh-rsa");

这会让JSch优先尝试用RSA密钥去匹配known_hosts中的条目。

3. 手动验证known_hosts条目有效性

有时候ssh-keyscan生成的条目可能存在格式问题,你可以直接从Debian服务器上复制公钥到known_hosts:

  1. 在Debian服务器上执行:cat /etc/ssh/ssh_host_rsa_key.pub
  2. 复制输出的公钥字符串,在本地known_hosts中添加一行:184.154.70.174 [公钥内容]
    (确保整行连续,没有换行截断)

4. 临时跳过文件读取,直接在代码中注入主机密钥(用于排查)

如果上面的方法都无效,可以直接在代码中传入主机密钥,验证是否是文件读取的问题:

import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;

// ... 其他代码 ...

try {
    // 直接用字符串传入主机密钥条目
    String knownHostEntry = "184.154.70.174 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNv4m+tOZUipp8UDGrd+kbtsM5R+tu3ZYZi3p7OTRWUX/Wqy74pONlLqI+/WGu77EHnOfdssJfclgo37vKLRFKneXZNAMXE7FUu5yUNOHlpPwzmvYUT/sp1k9CeNrtJAbkm05pOBIDqDQQGfQ+IAw9zqqo/sqJ6c8NKiVFAt4Ud0msvedb559dhYgcjwb52ABbsJ0mZ8FnU7LKG1592/ZTtYxam+M3qMhtJacrh5gpfZjjx2lGhqpOgvM+xwWeK6DQVn0QyIJd474G3gcm4M43ErRfzXOum3p/0wOw+hL1ora9eWSz2Wf9WuDXf86xkbZPD7Gy6ER5LBhquy331p7X";
    SSH.setKnownHosts(new ByteArrayInputStream(knownHostEntry.getBytes(StandardCharsets.UTF_8)));
    
    SSH.addIdentity(keyPath, keyPass);
    Session session = SSH.getSession("root", "184.154.70.174", 22);
    session.setConfig("CheckHostIP", "no");
    session.setConfig("StrictHostKeyChecking", "yes");
    session.connect();
} catch (Exception e) {
    e.printStackTrace();
}

如果这段代码能成功连接,说明你的known_hosts文件存在读取权限或格式问题,需要检查文件路径、权限或换行符(建议把文件转成LF换行格式)。

5. 更新JSch版本

如果你使用的是较旧的JSch版本(比如0.1.50之前),建议升级到最新稳定版(比如0.1.55),旧版本对OpenSSH格式的known_hosts支持可能存在bug。


内容的提问来源于stack exchange,提问作者Kihz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 17:48:11