You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 13:31:00