我试图连接到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私人密钥-----"
谢谢你@Vladi。在我的例子中,我需要连接到一个同时使用私钥和密码的服务器。因此,我必须这样设置配置
session.setConfig("PreferredAuthentications", "publickey,password");
session.setPassword("some_password");
这就是我如何连接本地使用路径的私人密钥时
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连接,我想在登录屏幕上询问密码短语,尝试解密私钥,如果错误,返回登录窗口。 我找不到方法来发现 在尝试建立任何会话之前,是否有任何方法可以检测密码短语是否正确? 谢谢你。