开启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:
- 在Debian服务器上执行:
cat /etc/ssh/ssh_host_rsa_key.pub - 复制输出的公钥字符串,在本地
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
相关产品推荐
相关产品推荐

