我是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连接中?有什么方法可以获得关于我失败的更多信息吗?
发布于 2012-06-10 02:34:18
是的,如果您使用公钥身份验证,JSch期望公钥文件与您作为参数传递给addIdentity()的私钥文件位于相同的目录中(名称相同,但添加了.pub)。或者,您可以使用the method variant which takes both file names as parameters,或者将它们作为字节数组传递。
原因是,在SSH公钥认证协议中,客户端首先向服务器发送可用公钥的列表,并且服务器从这些公钥中选择合适的公钥-只有当需要私钥时才需要私钥(并且如果需要,将被解密)。虽然它(取决于算法和密钥表示)可能可以从私有密钥计算公钥,但JSch本身不会这样做,所以您必须提供这两个密钥。
https://stackoverflow.com/questions/10637586
复制相似问题