java - jsch session.connect() 问题

标签 java sftp jsch

我是 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/

相关文章:

java - 用于 Java 应用程序的 Transact-SQL 嵌入式数据库

java - 我们什么时候应该使用远程过程调用?

java - 我们如何使用公钥从服务器托管的应用程序中使用 JSch 连接到 SFTP 服务器

java - 如何保护 APK 文件中的 SFTP 密码

jsch - 使用 ChannelSftp 进行文件传输时保留上次修改日期

java - Jsch SFTP 客户端无法创建新的 native 线程

Java socket.io 客户端 portage

java - 使用 java mail api 读取 .msg 文件 ..pls 建议我

ssh - sftp 失败,错误为 'message too long'

java - 如何使用带有 SFTP 协议(protocol)的 JSch 检查读取权限?