6

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

谢谢!

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

对于上下文,我想从我的 Android 手机读/写我学校的服务器。

4

1 回答 1

10

要启用公钥身份验证,您必须使用其中一种JSch.addIdentity方法。

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

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

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

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

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

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

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

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

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

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

于 2011-10-06T11:53:23.517 回答