使用JSch SSH客户端通过RSA密钥对连接EC2时认证失败
JSch连接EC2时RSA密钥认证失败(Auth fail)排查与解决
问题描述
尝试使用JSch SSH客户端通过RSA密钥对连接EC2服务器时,出现Auth fail错误。同一密钥对通过终端可正常连接EC2,密码认证模式也能正常工作,但无法通过.pem密钥文件完成认证。
相关代码
package org.example; import com.jcraft.jsch.ChannelShell; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import java.io.*; import java.util.Scanner; import java.util.UUID; import java.util.regex.Pattern; public class Ssh { private Session session = null; private final HostInfo host; private BufferedReader reader; private BufferedReader error; private ChannelShell channel; private BufferedWriter writer; public Ssh(HostInfo host) { this.host = host; } public void setup() throws Exception { JSch jSch = new JSch(); jSch.addIdentity("aws-ssh.pem"); session = jSch.getSession(host.getUsername(), host.getHost(), host.getPort()); session.setConfig("StrictHostKeyChecking", "no"); session.connect(); channel = (ChannelShell) session.openChannel("shell"); channel.connect(); InputStream in = channel.getInputStream(); InputStream err = channel.getExtInputStream(); OutputStream out = channel.getOutputStream(); reader = new BufferedReader(new InputStreamReader(in)); writer = new BufferedWriter(new OutputStreamWriter(out)); error = new BufferedReader(new InputStreamReader(err)); } }
错误信息
Exception in thread "main" com.jcraft.jsch.JSchException: Auth fail at com.jcraft.jsch.Session.connect(Session.java:519) at com.jcraft.jsch.Session.connect(Session.java:183) at org.example.Ssh.setup(Ssh.java:30) at org.example.Main.main(Main.java:12)
排查与解决方法
确认密钥文件路径有效性
代码中使用相对路径aws-ssh.pem,程序运行时可能因工作目录问题找不到文件。建议替换为绝对路径,比如/Users/xxx/Documents/aws-ssh.pem,确保JSch能正确读取密钥文件。修正密钥文件权限
EC2的.pem文件要求严格权限,必须设置为600(仅所有者可读可写),否则SSH服务会拒绝使用该密钥。执行以下命令修改权限:chmod 600 aws-ssh.pem显式配置SSH认证参数
部分场景下JSch需要明确指定认证算法或优先方式,可在session.connect()前添加以下配置:// 优先使用公钥认证 session.setConfig("PreferredAuthentications", "publickey"); // 启用ssh-rsa算法(部分EC2实例可能默认禁用) session.setConfig("PubkeyAcceptedAlgorithms", "+ssh-rsa");同时,可完整指定
addIdentity参数,避免默认参数导致的问题:jSch.addIdentity("aws-ssh.pem", null, null, null);开启JSch调试日志定位问题
启用调试日志可以查看认证过程的详细信息,帮助确定是密钥读取失败还是服务器拒绝认证:JSch.setLogger(new com.jcraft.jsch.Logger() { @Override public boolean isEnabled(int level) { return true; } @Override public void log(int level, String message) { System.out.println("[JSch Debug] " + message); } });运行程序后,查看输出日志,重点关注密钥加载、认证请求的相关信息。
核对EC2实例SSH配置
登录EC2实例,检查/etc/ssh/sshd_config文件,确保以下配置项正确:RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys同时确认你的公钥已正确添加到
~/.ssh/authorized_keys文件中(终端能正常连接的话,这一步大概率没问题,但可再次核对)。
内容的提问来源于stack exchange,提问作者Vijay Patidar
相关产品推荐
相关产品推荐

