【问题标题】:JSch: How to ssh into a server using ssh-keysJSch:如何使用 ssh-keys SSH 进入服务器
【发布时间】:2023-08-27 18:20:02
【问题描述】:

我想从另一个 ssh 服务器后面 ssh 到一个服务器。网关服务器需要用户名/密码,我可以这样做。我正在使用隧道进入下一个服务器,但是这个需要一个 ssh 密钥。我已经通过 PuTTY 生成了密钥,所以它存在于我的用户名中,但我不确定如何为我的 Java 程序检索它。是配置吗?即 setConfig("userauth.publickey", "com.jcraft.jsch.UserAuthPublicKey") 那么我该如何使用它或其他东西?文档似乎很少,我感谢任何帮助。当我连接此会话时,我尝试过的任何事情都会给我一个错误:“身份验证失败”

谢谢!

我使用的隧道方法是:http://sourceforge.net/apps/mediawiki/jsch/index.php?title=ProxySSH 非常感谢编写它的人!

就上下文而言,我想通过我的 Android 手机读取/写入学校的服务器。

【问题讨论】:

    标签: android ssh jsch


    【解决方案1】:

    要启用public-key authentication,您必须使用JSch.addIdentity 方法之一。

    它们采用 OpenSSH 密钥格式的公钥和私钥 - 因此请确保以这种格式从 PuTTY 导出它。 (JSch 不理解 PuTTY 的原生格式,但您可以编写一个实现 Identity 接口的适配器,自己解析它)。

    添加到 JSch 的身份是全局的,而不是每个会话的。这通常不是问题,因为 JSch 会按顺序尝试所有自身和服务器都支持的认证方法,并且公钥认证通常在密码认证之前。

    所有身份验证方法都需要一个用户名(通常是要登录的帐户的名称)。

    使用公钥身份验证,公钥必须事先以某种方式可供服务器使用。对于 OpenSSH 的 sshd,公钥应该列在 ~/.ssh/authorized_keys 中。 (如果您只有一个公钥,只需将其复制到此文件中,如果您有多个(每个都允许),每个都应该在一行上。)

    所以它应该在设置身份后开箱即用。

    如果您想确保第一个会话使用密码身份验证,而第二个(隧道)会话使用公钥,您可以使用 per-session 配置,覆盖全局配置:

    tunnelSession.setConfig("PreferredAuthentications", "password");
    
    innerSession.setConfig("PreferredAuthentications", "publickey");
    

    (这些是逗号分隔的列表,这里每个元素都有一个。)

    关于 ProxySSH 示例,这是我写的(在 JSch 的作者 Atsuhiko Yamanaka 的帮助下)。我应该将此信息添加到 Wiki 页面,也许。

    【讨论】:

    • 由于第二个 SSH 不接受用户名,在实例化会话时我应该为该字段使用什么?空字符串还是 null?即 jsch.getSession(WHAT_GOES_HERE?, hostname, 22);
    • 我不断收到 Auth Fail 错误。我在本地存储了 id_rsa 和 id_rsa.pub,我使用 PuTTYgen 导出为 OpenSSH 密钥,然后在 addIdentity(...) 中使用它。我错过了什么吗?在第一台服务器上有一个 /.ssh/authorized_keys 文件,它是 id_rsa.pub 的副本,如果相关的话。
    • 总是需要一个 SSH 用户名 - 如果没有这个,您将无法登录服务器。 (毕竟,发送的命令必须在某个本地用户帐户中执行。).ssh/authorized_keys 文件(包含允许登录的公钥)必须在您想要的用户的主目录中登录。
    • 当然!很遗憾我被困在这样一个微不足道的问题上,但多亏了你,现在一切正常。非常感谢!