微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决获取“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"))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。