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

使用sshj和PuttyKeyFile从SFTP拉取文件认证失败问题求助

问题根因排查
  • 第一:认证方法未合并
    你当前代码中构造authMethods时仅加入了密码认证逻辑,定义的密钥认证变量key完全没有合并到最终的认证方法列表中,相当于只提交了密码认证,自然无法通过需要双因素的服务器校验。
  • 第二:多因素认证逻辑错误
    SSHJ默认传入auth方法的AuthMethod列表是「尝试顺序的单因素候选」,意思是只要其中一个方法通过就算认证成功。如果你的服务器要求同时完成公钥+密码双因素认证,不能直接把两个方法塞到普通列表里,需要使用多因素认证构造器。
  • 第三:密钥加载逻辑可优化
    你当前的KeyPairWrapper构造逻辑可以直接使用SSHJ内置的工具类实现,减少自定义封装带来的未知问题。
可行实现方案

修正后的可运行代码如下:

import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.userauth.method.AuthPassword;
import net.schmizz.sshj.userauth.method.AuthPublicKey;
import net.schmizz.sshj.userauth.method.AuthMultiFactor;
import net.schmizz.sshj.transport.verification.PromiscuousVerifier;
import net.schmizz.sshj.userauth.keyprovider.PuttyKeyFile;
import java.io.File;
import java.util.List;

public class SftpAuthDemo {
    public void connectSftp(SftpConfig config) throws Exception {
        SSHClient client = new SSHClient();
        client.setTimeout(config.getTimeout());
        client.setConnectTimeout(config.getTimeout());
        client.addHostKeyVerifier(new PromiscuousVerifier());
        
        try {
            client.connect(config.getHost(), config.getPort());
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
        
        // 加载PPK密钥
        PuttyKeyFile ppkKey = new PuttyKeyFile();
        ppkKey.init(new File(config.getPrivateKeyPath()));
        AuthPublicKey pubKeyAuth = new AuthPublicKey(ppkKey);
        
        // 构造密码认证
        AuthPassword pwdAuth = new AuthPassword(config.getPassword().toCharArray());
        
        // 构造双因素认证:要求公钥+密码都通过
        AuthMultiFactor multiAuth = new AuthMultiFactor(List.of(pubKeyAuth, pwdAuth));
        
        try {
            client.auth(config.getUsername(), multiAuth);
        } catch (Exception e) {
            // 部分服务器返回部分成功标识,用分步认证兼容
            if (e.getMessage().contains("Partial success")) {
                client.auth(config.getUsername(), pwdAuth);
            } else {
                e.printStackTrace();
                throw e;
            }
        }
        
        // 认证通过后即可初始化SFTP客户端操作文件
        // var sftpClient = client.newSFTPClient();
    }

    // 配置类示例,可根据你的实际业务调整
    public static class SftpConfig {
        private String host;
        private int port;
        private String username;
        private String password;
        private String privateKeyPath;
        private int timeout;
        // 省略对应getter、setter方法
    }
}
额外校验点
  • 确认你的sshj依赖版本在0.32.0及以上,旧版本对PPK格式的兼容性较差,多因素认证支持也存在缺陷
  • 如果服务器SSH服务配置了AuthenticationMethods publickey,password,必须严格按照这个顺序提交认证方法,调整AuthMultiFactor构造参数的列表顺序即可
  • 排查PPK文件的系统权限,确保运行Java进程的用户对该文件有读取权限

内容的提问来源于stack exchange,提问作者Jacek Andrzejczyk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:30:05