当前位置: 首页 > 知识库问答 >
问题:

使用JSch与密钥进行Java ssh连接-Auth失败

巫马望
2023-03-14

我试图连接到localhost使用ssh键,但我仍然得到"Auth失败"错误。

以下是方法实现:

public void downloadUsingPublicKey(String username, String host)
    {

         String privateKey = "~/.ssh/id_rsa";

         JSch jsch = new JSch(); 
         Session session = null; 
         Channel channel = null; 
         ChannelSftp channelSftp = null; 
         try 
         { 

             jsch.addIdentity(privateKey); 
             System.out.println("Private Key Added."); 


             session = jsch.getSession(username, host); 
             System.out.println("session created."); 

             java.util.Properties config = new java.util.Properties(); 
             config.put("StrictHostKeyChecking", "no"); 

             session.setConfig(config); 
             session.connect(); 

             channel = session.openChannel("sftp"); 
             channel.connect(); System.out.println("shell channel connected...."); 

             channelSftp = (ChannelSftp)channel; 
             channelSftp.cd(Config.dir); 

             System.out.println("Changed the directory..."); 
         } catch (JSchException e) 
         { 
             // TODO Auto-generated catch block 
             e.printStackTrace(); 
         } catch (SftpException e) 
         { 
             // TODO Auto-generated catch block 
             e.printStackTrace(); 
         }finally
         { 
             if(channelSftp!=null)
             { 
                 channelSftp.disconnect(); 
                 channelSftp.exit(); 
             } 
             if(channel!=null) channel.disconnect(); 
             if(session!=null) session.disconnect(); 
         } 
    }

我使用linux终端创建了我的公钥/私钥对,如下所示:

ssh-keygen -t rsa -b 4096 -C "myemail@email.com"

我没有说任何短语。下一步:

ssh-add ~/.ssh/id_rsa

最后

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

然后当我运行我的程序时,我得到一个错误:

com.jcraft.jsch.JSchException: Auth fail
    at com.jcraft.jsch.Session.connect(Session.java:512)
    at com.jcraft.jsch.Session.connect(Session.java:183)
    at pl.eroj.filedownloader.Downloader.downloadUsingPublicKey(Downloader.java:73)
    at pl.eroj.filedownloader.Downloader.main(Downloader.java:107)

有什么想法吗?我的密钥是OpenSSH类型,从行开始 "-----开始RSA私人密钥-----"

共有2个答案

冯哲彦
2023-03-14

谢谢你@Vladi。在我的例子中,我需要连接到一个同时使用私钥和密码的服务器。因此,我必须这样设置配置

        session.setConfig("PreferredAuthentications", "publickey,password");
        session.setPassword("some_password");
莘俊能
2023-03-14

这就是我如何连接本地使用路径的私人密钥时
Private ateKeyPath="C:\Keys\private_key.ppk"

    public static OutputStream ConnectionUsingKey(String user, String hostName, String privateKeyPath)
        throws JSchException, IOException {
    JSch jsch = new JSch();
    Session session = null;
    try {

        jsch.addIdentity(privateKeyPath);
        session = jsch.getSession(user, hostName, 22);
        session.setConfig("PreferredAuthentications", "publickey");
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();
        if (session.isConnected() == true) {
            System.out.println("Connection to Session server is successfully");
        }
        channel = session.openChannel("shell");
        channel.setInputStream(System.in);
        channel.setOutputStream(System.out);
        channel.connect(30 * 1000);
        return channel.getOutputStream();

    } catch (JSchException e) {
        throw new RuntimeException("Failed to create Jsch Session object.", e);
    }
}
 类似资料:
  • 一段时间以来,我一直在阅读CodeProject a的一篇文章,该文章解释了如何使用RSA提供程序进行加密和解密: RSA私钥加密 虽然2009年的旧版本有缺陷,但2012年的新版本(支持System.Numerics.BigInteger)似乎更可靠。但这个版本缺少的是一种使用公钥加密和使用私钥解密的方法。 所以,我自己也试过了,但解密时会收到垃圾。我对RSA提供商不熟悉,所以我对这里一无所知。

  • 我有两个具有可信连接的服务器。我想通过不经主机密钥验证的ssh连接,通过SFTP传输文件。

  • 我正在尝试将我的应用程序从128位AES密钥升级为256位AES。然而,当我将第54行从128更改为256时,我会得到以下密钥大小错误。 java.security.无效密钥异常: 非法的密钥大小 我已正确安装了JCE文件,我的应用程序生成较长的密钥这一事实证明了这一点。 我在其他文章中看到过“AES / CBC / PKCS7Padding”加密方法,但这只会让我遇到这个例外:

  • 问题内容: 我正在使用JSCH进行sftp文件上传。在当前状态下,每个线程都会在需要时打开和关闭连接。 是否可以在JSCH中使用连接池,以避免由于大量打开和关闭连接而导致的开销? 这是从线程内部调用的函数的示例 问题答案: 为此,我希望使用commons-pool。;)

  • 对于一个非常简单的应用程序,它主要依赖于通过JSch建立的ssh连接,我想在登录屏幕上询问密码短语,尝试解密私钥,如果错误,返回登录窗口。 我找不到方法来发现 在尝试建立任何会话之前,是否有任何方法可以检测密码短语是否正确? 谢谢你。