Docker容器中Java SSH连接报错:HostKey has been changed求助
安全解决JSch非默认端口SSH连接的HostKey变更错误
核心原因
当连接非22端口的SSH主机时,known_hosts中的条目必须包含端口号(格式为[IP]:端口),否则JSch会将带端口的连接视为全新主机,触发密钥不匹配的错误。你之前的操作未针对指定端口生成正确的主机密钥条目,导致验证失败。
安全解决步骤
1. 生成带端口的主机密钥并写入known_hosts
在容器内执行以下命令(或在本地挂载的/home/myusername/.ssh目录下执行,挂载后会同步到容器):
ssh-keyscan -t rsa,ecdsa -p <你的端口号> 192.xx.xx.xx >> /root/.ssh/known_hosts
执行后检查known_hosts文件,确认存在类似如下格式的条目:
[192.xx.xx.xx]:<端口号> ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ... [192.xx.xx.xx]:<端口号> ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBB...
2. 修正.ssh目录及文件权限
SSH对权限要求严格,挂载后的目录/文件权限可能不符合要求,导致JSch无法正常读取验证信息:
# 容器内修正权限 chmod 700 /root/.ssh chmod 644 /root/.ssh/known_hosts chmod 600 /root/.ssh/id_rsa
如果在本地修改挂载目录权限,对应执行:
chmod 700 /home/myusername/.ssh chmod 644 /home/myusername/.ssh/known_hosts chmod 600 /home/myusername/.ssh/id_rsa
3. 验证JSch加载known_hosts的逻辑
确认代码中jsch.setKnownHosts("/root/.ssh/known_hosts")路径正确,可添加调试输出检查加载的主机密钥:
// 调试:打印已加载的主机密钥 HostKeyRepository repo = jsch.getHostKeyRepository(); HostKey[] keys = repo.getHostKeys(); for(HostKey key : keys){ System.out.println("加载的主机密钥:" + key.getHost() + " " + key.getType()); }
确认输出中包含[192.xx.xx.xx]:<端口号>的条目。
额外注意事项
- 不要直接删除整个
known_hosts后用普通ssh命令连接,若容器内ssh配置与代码使用的配置不一致,仍可能生成不匹配的条目。 - 确保代码中获取的
host和port与known_hosts中的条目完全匹配(IP+端口的格式)。
内容的提问来源于stack exchange,提问作者MKRabbit
相关产品推荐
相关产品推荐

