我是 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 的路径是我保存 key 和主机文件的完整 unix 路径,我已将其移动到包含启动此过程的脚本的目录。我对 sftp 还是有点陌生,我的公钥是否必须在同一个目录中,即使我没有将它添加到 Jsch 连接中?有什么方法可以获取有关我失败的更多信息吗?
最佳答案
是的,如果您使用公钥身份验证,JSch 期望公钥文件与您作为参数传递给 .pub
的私钥文件位于同一目录中(并且名称相同,并添加了 addIdentity()
)。 .或者,您可以使用 the method variant which takes both file names as parameters ,或将它们作为字节数组传递。
原因是在 SSH 公钥认证协议(protocol)中,客户端首先向服务器发送一个可用公钥列表,服务器从中选择一个合适的——只有这样才需要私钥(并将被解密,如有必要)。
虽然它(取决于算法和 key 表示)可能可以从私钥计算公钥,但 JSch 本身并不这样做,因此您必须提供两个 key 。
关于java - jsch session.connect() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10637586/