“com.jcraft.jsch.JSchException:身份验证失败”,使用工作密码

问题描述 投票:0回答:10

在尝试将文件上传到我们的服务器时,我收到以下异常

    com.jcraft.jsch.JSchException: Auth fail
        at com.jcraft.jsch.Session.connect(Session.java:464)
        at com.jcraft.jsch.Session.connect(Session.java:158)
        at FtpService.transferFileToReciever(FtpService.java:80)
        at FtpService.transferFileToReciever(FtpService.java:54)
        at FtpService.transferFileToRecievers(FtpService.java:44)
        at FtpService.transferSingeFile(FtpService.java:241)
        at FtpService.main(FtpService.java:26)
    Auth fail
    
    

源文件中的函数transferFileToReciever的部分是

        JSch jsch = new JSch();
        jsch.addIdentity("/root/.ssh/id_dsa");
        Session session = jsch.getSession(username, host, 22);

        session.setUserInfo(serverinfo);
        session.connect(); //geting exception here

        boolean ptimestamp = true;

    

密码有效,因为我可以使用 ssh 登录,但使用 JSCh 即使提供密钥、用户名和密码也不起作用。 使用 java 版本“1.6.0_25”的 id_dsa 密钥。 可能是什么错误?

找到其他类似问题,但没有答案。

java jsch
10个回答
33
投票

追根溯源,最终发现dsa类型的公钥没有添加到远程服务器上的授权密钥中。添加同样的内容对我有用。

ssh 正在使用 rsa 密钥,让我回顾我的代码。

谢谢大家。


8
投票

尝试显式添加 auth 方法,如下所示,因为有时需要:

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

4
投票

我也遇到了身份验证失败问题,我的代码的问题是我有

channelSftp.cd("");

改成了

channelSftp.cd(".");

然后就可以了。


4
投票

如果用户名/密码包含任何特殊字符,则在骆驼配置中使用 RAW 来配置值,例如

  • RAW(se+re?t&23)
    其中
    se+re?t&23
    是实际密码

  • RAW({abc.ftp.password})
    ,其中
    {abc.ftp.password}
    值来自 spring 属性文件。

通过使用RAW,解决了我的问题。

http://camel.apache.org/how-do-i-configure-endpoints.html


3
投票

示例案例,当我从远程服务器获取文件并将其保存在本地计算机中时
封装连接器;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

public class Main {

    public static void main(String[] args) throws JSchException, SftpException, IOException {
        // TODO Auto-generated method stub
        String username = "XXXXXX";
        String host = "XXXXXX";
        String passwd = "XXXXXX";
        JSch conn = new JSch();
        Session session = null;
        session = conn.getSession(username, host, 22);
        session.setPassword(passwd);
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();

        ChannelSftp channel = null;
        channel = (ChannelSftp)session.openChannel("sftp");
        channel.connect();

        channel.cd("/tmp/qtmp");

        InputStream in = channel.get("testScp");
        String lf = "OBJECT_FILE";
        FileOutputStream tergetFile = new FileOutputStream(lf);

        int c;
        while ( (c= in.read()) != -1 ) {
            tergetFile.write(c);
        } 

        in.close();
        tergetFile.close();

        channel.disconnect();
        session.disconnect();   

    }

}

2
投票

找到其他类似问题,但没有答案。

知道您在哪里找到这个问题会很有趣。

据我所知,根据 com.jcraft.jsch.JSchException:身份验证取消 尝试向方法

.addIdentity()
添加密码。如果您生成的密钥文件没有密钥文件,则可以使用
""
。 另一个错误来源是指纹字符串。如果不匹配,您也会遇到身份验证失败(取决于目标服务器)。

最后这里是我的工作源代码 - 在我解决了丑陋的管理任务之后:

public void connect(String host, int port, 
                    String user, String pwd,
                    String privateKey, String fingerPrint,
                    String passPhrase
                  ) throws JSchException{
    JSch jsch = new JSch();

    String absoluteFilePathPrivatekey = "./";
    File tmpFileObject = new File(privateKey);
    if (tmpFileObject.exists() && tmpFileObject.isFile())
    {
      absoluteFilePathPrivatekey = tmpFileObject.getAbsolutePath();
    }

    jsch.addIdentity(absoluteFilePathPrivatekey, passPhrase);
    session = jsch.getSession(user, host, port);

    //Password and fingerprint will be given via UserInfo interface.
    UserInfo ui = new UserInfoImpl(pwd, fingerPrint);
    session.setUserInfo(ui);

    session.connect();

    Channel channel = session.openChannel("sftp");
    channel.connect();
    c = (ChannelSftp) channel;
}

1
投票

我们同时使用密码+公钥并收到此错误。我们的问题是我们的公钥使用 OpenSSH,而 Jsch 不支持 OpenSSH,因此必须使用 Jsch 的分叉和改进版本:https://github.com/mwiede/jsch


0
投票

在我的例子中,我使用了以下依赖项

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.42</version>
</dependency> 

并获得相同的身份验证失败异常,但更新了对以下版本的依赖关系,问题得到解决。

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.54</version>
</dependency>

0
投票

我在使用maven插件时遇到了这个问题

git-commit-id-plugin
。我能够推送到本地 git 项目的远程,但是 该插件在运行时出现此错误
mvn compile
。看来该插件需要使用
https
协议指定的当前 git 项目的远程。相反,我拥有的是:

$ git remote -v
origin  [email protected]:johnbet/myprojectname.git (fetch)
origin  [email protected]:johnbet/myprojectname.git (push)

我解决了设置远程 URL 的问题

$ git remote set-url origin https://github.com/johnbet/myprojectname.git

使得上一个命令返回:

$ git remote -v
origin  https://github.com/johnbet/myprojectname.git (fetch)
origin  https://github.com/johnbet/myprojectname.git (push)

我发现这一点是因为我注意到我的项目最初的远程(我从另一个 GitHub 存储库克隆它)正在使用

https
协议,而我之后设置的协议则不是。

请参阅有关更改远程存储库 url 的官方文档此处


0
投票

最近,这个问题的一个新变体出现了。默认情况下,某些 Linux 机器(例如 Amazon Linux 2023)不支持旧版 ssh-rsa。 SSH 客户端必须支持 rsa-sha2-256 或 rsa-sha2-512 - 这对于 jcsh 来说可能是不可能的。

在这种情况下,必须在 Linux 服务器中重新启用 ssh-rsa 支持。在 AL2023 中,这可以通过激活 LEGACY 系统加密策略来完成 - 如下所示

sudo dnf install crypto-policies-scripts
sudo update-crypto-policies --set LEGACY
# Then reboot the server
© www.soinside.com 2019 - 2024. All rights reserved.