获取“com.jcraft.jsch.JSchException:身份验证失败”——但“ssh”可以使用公钥身份验证登录

问题描述

我正在尝试使用 JSch 连接远程服务器,但出现 “身份验证失败” 异常。下面是我的代码:

String user = "user.name";
String host = "hostip";
try
{
    JSch jsch = new JSch();
    Session session = jsch.getSession(user,host);
    session.setConfig("StrictHostKeyChecking","no");
    System.out.println("Establishing Connection...");
    session.connect();
    int assinged_port=session.setPortForwardingL(lport,rhost,rport);
    System.out.println("localhost:"+assinged_port+" -> "+rhost+":"+rport);
}
catch(Exception e){System.err.print(e);}

但是,当我尝试使用命令 ssh user.name@hostip 从 iTerm ssh 时,我可以使用公钥身份验证成功访问远程服务器。

解决方法

您的 OpenSSH ssh 命令会自动使用您在 .ssh 文件夹中为 OpenSSH 配置的私钥。

JSch 不会自动使用 OpenSSH 密钥。你必须明确告诉它使用什么键。
Can we use JSch for SSH key-based communication?

另请注意,JSch 并不支持 OpenSSH 支持的所有密钥格式。
"Invalid privatekey" when using JSch


强制性警告:不要使用 StrictHostKeyChecking=no 盲目接受所有主机密钥。这是一个安全漏洞。你失去了对 MITM attacks 的保护。有关正确(且安全)的方法,请参阅:How to resolve Java UnknownHostKey,while using JSch SFTP library?

,

正如@martin prikryl 所说: JSch 不会自动使用 OpenSSH 密钥

File file = new File(SystemUtils.getUserHome() + "/.ssh/id_rsa");
String knownHosts = SystemUtils.getUserHome() + "/.ssh/known_hosts";
jsch.setKnownHosts(knownHosts);
jsch.addIdentity(file.getPath());

SystemUtils 属于 Apache Commons Lang3 或者你可以使用:

new File(System.getProperty("user.home"))

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...