我正在使用Spring集成(版本:6.1.2)连接到SFTP服务器.在创建SFTP会话时,我遇到此异常-

java.lang.IllegalStateException: failed to create SFTP Session
....
Caused by: org.apache.sshd.common.SshException: Unable to negotiate key exchange for kex algorithms (

client: 
curve25519-sha256,
curve25519-sha256@libssh.org,
curve448-sha512,
ecdh-sha2-nistp521,
ecdh-sha2-nistp384,
ecdh-sha2-nistp256,
diffie-hellman-group-exchange-sha256,
diffie-hellman-group18-sha512,
diffie-hellman-group17-sha512,
diffie-hellman-group16-sha512,
diffie-hellman-group15-sha512,
diffie-hellman-group14-sha256,
ext-info-c

server: 
diffie-hellman-group1-sha1,
diffie-hellman-group14-sha1)

显然,服务器只支持旧的算法.如何在我的SFTP会话中添加对这些算法的支持?

我的密码是这样的-

DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory();
factory.setHost("ftp.sssss.com");
factory.setPort(Integer.valueOf(22));
factory.setAllowUnknownKeys(true);
factory.setUser("user");
factory.setPassword("password");

SftpSession sftpSession = factory.getSession();

推荐答案

显然,这些算法已经被弃用:https://issues.apache.org/jira/browse/SSHD-1004.

这条so线程解释了如何启用这些旧的密钥:Mina SSHD enable KEX with SHA1 in version 2.6.0.

DefaultSftpSessionFactory支持外部SshClient:

/**
 * Instantiate based on the provided {@link SshClient}, e.g. some extension for HTTP/SOCKS.
 * @param sshClient the {@link SshClient} instance.
 * @param isSharedSession true if the session is to be shared.
 */
public DefaultSftpSessionFactory(SshClient sshClient, boolean isSharedSession) {

因此,您需要这样做:

SshClient client = SshClient.setUpDefaultClient();
client.setKeyExchangeFactories(NamedFactory.setUpTransformedFactories(
        false,
        BuiltinDHFactories.VALUES,
        ClientBuilder.DH2KEX
    ));
client.setSignatureFactories(new ArrayList<>(BuiltinSignatures.VALUES))

然后把这client注入DefaultSftpSessionFactory.

Java相关问答推荐

为什么接口中的主函数而不是类中的主函数在Java 17中编译和运行没有问题?

Javascript更新alert 可扩展内容样式与CSS—按钮更多/更少

Java模式匹配记录

弹簧靴和龙目岛

为什么不应用类型推断?

JavaFX如何在MeshView中修复多个立方体?

如何在Java中从XML中获取特定的 node ,然后将其删除?

为什么我的回收视图会显示重复的列表?

如何集成语义发布和BitBucket(Java项目)

如何在构建Gradle项目时排除com.google.guava依赖项的一个变体

使用htmlunit和java单击按钮

在Java中将.GRF转换为图像文件

JPA无手术同品种器械可能吗?

在Java中使用StorageReference将数据从Firebase存储添加到数组列表

根据应用程序 Select 的语言检索数据

无限递归Java问题

由于可为null,无法在kotlin中实现java接口

获取401未经授权,即使在标头中设置了浏览器名称和cookie

错误:JOIN/ON的参数必须是boolean类型,而不是bigint类型.Java Spring启动应用程序

Java 8 中 ByteBuffer 和 BitSet 的奇怪行为