使用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
相关产品推荐
相关产品推荐

