3

我是 Jsch 的新手,我正在尝试通过 sftp 连接到第三方。我可以通过 ssh 连接,所以我知道我有正确的用户、主机、端口和私钥文件,但是当我尝试通过 Jsch 连接时,我收到异常消息“Auth failed”,这几乎但不是很有帮助。这是我从在线示例中拼凑的代码:

String pvtkey = "{unixpath}/id_dsa";
ChannelSftp sftp = null;
JSch jsch = new JSch();
Session session = null;

try {
    jsch.setKnownHosts("{unixpath}/known_hosts");
    jsch.addIdentity(pvtkey);
    session = jsch.getSession(user, connectionURL, 22);
    Properties config = new Properties();
    config.put("StrictHostKeyChecking", "no");
    session.setConfig(config);
    session.connect();
    // ...some other code that never gets called
} catch (JSchException e) {
    log.info(e.getMessage());
    log.error(e.getCause());
}

我添加了一些日志,所以我知道失败是在 session.connect() 中发生的。我已经抓住了用户和 connectionURL 并验证了它们是否被正确传递。pvtkey 和 known_hosts 的路径是我保存密钥和主机文件的完整 unix 路径,我已将其移动到包含启动此过程的脚本的目录。我对 sftp 还是有点陌生​​,我的公钥是否必须在同一个目录中,即使我没有将它添加到 Jsch 连接中?有什么方法可以获取有关我失败的更多信息吗?

4

3 回答 3

0

是的,如果您使用公钥身份验证,JSch 期望公钥文件与.pub您作为参数传递给addIdentity(). 或者,您可以使用将两个文件名都作为参数的方法变体,或者将它们作为字节数组传递。

原因是在 SSH 公钥认证协议中,客户端首先向服务器发送一个可用公钥列表,服务器从中选择一个合适的——只有这样才需要私钥(并将被解密,如有必要)。虽然它(取决于算法和密钥表示)可能可以从私钥计算公钥,但 JSch 本身并不这样做,因此您必须提供两个密钥。

于 2012-06-09T18:34:17.503 回答
0

因为你正在使用

config.put("StrictHostKeyChecking", "no");

你不需要任何密钥文件。它禁用主机密钥检查。你能在执行程序后显示日志有什么吗?以便我们可以帮助你。

于 2013-01-03T08:23:41.633 回答
0

为我使用下面的代码它的工作人员:try { Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); config.put("PreferredAuthentications", "publickey,keyboard-interactive,password"); jsch.addIdentity(); System.out.println("identity added "); session = jsch.getSession(user, host, 22); // session.setPassword("123"); session.setConfig(config); session.connect(); Channel channel = session.openChannel("sftp"); channel.connect(); } catch (JSchException e) { e.printStackTrace();
} catch (SftpException e) { e.printStackTrace(); }

于 2019-10-18T09:17:48.960 回答