【问题标题】:"reject HostKey" when connecting to remote host through jumphost with JSch使用 JSch 通过 jumphost 连接到远程主机时“拒绝 HostKey”
【发布时间】:2018-07-02 08:25:17
【问题描述】:

需要通过 jumphost SSH 到目标主机。已经尝试过JSch JumpHosts example中提到的相同方法。

Session[] sessions = new Session[2];
Session session = null;

sessions[0] = session = jsch.getSession(getUserName(), "jumphost1.com", 22);
session.setPassword(getHostPassword());
UserInfo userInfo = new UserInfo();
userInfo.setPassword(getHostPassword());
session.setUserInfo(userInfo);
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
prop.put("PreferredAuthentications", "publickey,keyboard-interactive,password");
session.setConfig(prop);
session.connect();

String host = "host1.com";
int assignedPort = session.setPortForwardingL(0, host, 22);
LOGGER.info("Jump host the {} of agent {} and port forwarding {}", i, host, assignedPort);

sessions[i] = session = jsch.getSession(getUserName(), "127.0.0.1", assignedPort);
session.setPassword(getHostPassword());
userInfo = new UserInfo();
userInfo.setPassword(getHostPassword());
session.setUserInfo(userInfo);
session.setHostKeyAlias(host);
session.connect();

连接到目标主机时出现以下异常:

Caused by: com.jcraft.jsch.JSchException: reject HostKey: 127.0.0.1
    at com.jcraft.jsch.Session.checkHost(Session.java:799)
    at com.jcraft.jsch.Session.connect(Session.java:345)
    at com.jcraft.jsch.Session.connect(Session.java:183)

我正在尝试通过jumphost1.com 登录主机host1.com

  • 登录jumphost1.com
  • 然后 ssh host1.com
  • 执行host1中的命令

【问题讨论】:

  • 我不知道 jsch,但从你所说的 127.0.0.1 在你的 jsch.getSession(...) 中,这里无关,应该是 jumphost1.com 或者 host1.com
  • JSCH 是 java 库,参考下面的例子jcraft.com/jsch/examples/JumpHosts.java.html
  • 好吧,没关系,您的代码似乎与示例一致(连接到第一台服务器,然后从该服务器获取127.0.0.1 上的会话)。我得让熟悉工具的人回答,祝你好运!

标签: java unix ssh jsch portforwarding


【解决方案1】:

您通过 jumphost 连接的代码是正确的。

唯一的问题是您的本地主机密钥存储库包含的第二台主机的主机密钥与您从真实(第二台)主机收到的主机密钥不同。

您实际上似乎并不关心安全,因为您为 jumphost 会话设置了 StrictHostKeyChecking=noofficial example 正确地没有这样做!)。但是您在第二次会话中不这样做,因此会出现错误。

另见How to resolve Java UnknownHostKey, while using JSch SFTP library?

【讨论】:

  • 这个 localhost 的意思是 jumphost1.com,所以它已经添加了 knowhost。如果我错了,请纠正我。我也应该能够在目标主机中使用 ChannelExec?
  • 还试图了解生成 knownhost 的第一步,我必须在所有主机中运行 ssh-keyscan 命令并在文件中? bcoz 我很少有使用不同 jumphost 的服务器,所以我在文件和上传中生成和映射相同的?
  • 我尝试为第二个会话设置 StrictHostKeyChecking=no ,但如果给我 Auth Cancel 错误原因:com.jcraft.jsch.JSchException: Auth cancel
  • 好的,问题解决了,因为您通过了主机密钥验证!虽然必须通过设置StrictHostKeyChecking=no 你放弃安全来重复这一点! - 无论如何,你现在有另一个问题 - 身份验证。一个明显的问题是,您使用密码而不是用户名:jsch.getSession(getHostPassword(), ...)
猜你喜欢
  • 2020-04-23
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 2023-01-14
  • 1970-01-01
相关资源
最近更新 更多