java客户端连接ssh失败问题的两种解决方法

 更新时间:2026年01月07日 08:45:42   作者:东北小狐狸  
有的运维工具使用了java的ssh客户端,这些客户端和服务端间有时会出现加密算法协商失败和主机密钥类型协商失败的问题,该问题是由于新客户端/服务端禁用了相关的不安全算法和密钥类型,本文简要记录下该问题的解决方法以备不时之需

问题现象

有的运维工具使用了java的ssh客户端,这些客户端和服务端间有时会出现加密算法协商失败和主机密钥类型协商失败的问题,该问题是由于新客户端/服务端禁用了相关的不安全算法和密钥类型,本文简要记录下该问题的解决方法以备不时之需。

错误常见提示如下:

#加密算法协商失败
Unable to negotiate with 192.168.56.99 port 54234: no matching key exchange method found. Their offer: diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 [preauth]

#主机密钥类型协商失败
Unable to negotiate with 192.168.56.99 port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss [preauth]

解决方法

二选一:

较新的客户端兼容旧服务端

以Jsch为例,升级新版本。

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version> <!-- 检查最新版本 -->
</dependency>

代码中配置连接属性:

import com.jcraft.jsch.*;

public class SSHConnector {
    public static void main(String[] args) {
        try {
            JSch jsch = new JSch();
            
            // 设置支持的算法
            java.util.Properties config = new java.util.Properties();
            
            // 关键配置:指定算法
            config.put("kex", "diffie-hellman-group1-sha1,diffie-hellman-group14-sha1");
            config.put("server_host_key", "ssh-rsa,ssh-dss");
            config.put("cipher.s2c", "aes128-ctr,aes128-cbc,3des-cbc");
            config.put("cipher.c2s", "aes128-ctr,aes128-cbc,3des-cbc");
            config.put("mac.s2c", "hmac-sha1");
            config.put("mac.c2s", "hmac-sha1");
            
            Session session = jsch.getSession("username", "172.16.29.254", 22);
            session.setConfig(config);
            session.setPassword("password");
            session.setConfig("StrictHostKeyChecking", "no"); // 临时测试用
            
            session.connect(30000); // 30秒超时
            System.out.println("连接成功");
            
            session.disconnect();
        } catch (JSchException e) {
            e.printStackTrace();
        }
    }
}

较新的服务端兼容旧客户端

/etc/ssh/sshd_config追加以下内容,这里添加的算法取决于Their offer后边提示的类型,一般只添加部分即可,推荐使用+追加额外算法。

#解决no matching key exchange method found报错
KexAlgorithms +diffie-hellman-group14-sha1
#解决no matching host key type found报错
HostKeyAlgorithms +ssh-rsa

附查看服务端ssh支持算法

hellxz@hz:~$ sudo sshd -T | grep -E "^hostkeyalg|^kexalg"
kexalgorithms sntrup761x25519-sha512@openssh.com,curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group14-sha256,diffie-hellman-group14-sha1
hostkeyalgorithms ssh-ed25519-cert-v01@openssh.com,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,rsa-sha2-512,rsa-sha2-256,ssh-rsa

到此这篇关于java客户端连接ssh失败问题的两种解决方法的文章就介绍到这了,更多相关java客户端连接ssh内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现可视化走迷宫小游戏的示例代码

    Java实现可视化走迷宫小游戏的示例代码

    这篇文章主要介绍了Java如何实现可视化走迷宫小游戏。本程序适用于java程序员巩固类与对象、文件读取、事件响应、awt包中各种工具的相关概念以及对逻辑能力的锻炼,需要的可以参考一下
    2022-11-11
  • RocketMQ消息发送与消息类别详解

    RocketMQ消息发送与消息类别详解

    这篇文章主要介绍了RocketMQ消息发送与消息类别详解,事务消息的生产者执行本地事务,并根据事务执行的结果选择是否提交或回滚事务,
    如果事务执行成功并选择提交事务,则产生注册成功消息,进入下一步,需要的朋友可以参考下
    2023-09-09
  • 详解openfeign集成spring cloud loadbalancer实现负载均衡流程

    详解openfeign集成spring cloud loadbalancer实现负载均衡流程

    这篇文章主要介绍了openfeign集成spring cloud loadbalancer实现负载均衡流程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • java实现即时通信的完整步骤分享

    java实现即时通信的完整步骤分享

    这篇文章主要给大家介绍了关于java实现即时通信的完整步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java遍历Map对象的四种方式

    Java遍历Map对象的四种方式

    本文给大家介绍java遍历map对象的四种方式,对java中遍历map感兴趣的朋友可以一起了解了解
    2015-10-10
  • SpringBoot中@ControllerAdvice注解的使用方法

    SpringBoot中@ControllerAdvice注解的使用方法

    这篇文章主要介绍了SpringBoot中@ControllerAdvice注解的使用方法,这是一个增强的 Controller,对controller层做异常处理、数据预处理、全局数据绑定, springboot 会自动扫描到,不需要调用,这个注解是spring MVC提供的,在springboot中也可以使用,需要的朋友可以参考下
    2024-01-01
  • Maven在Windows中的配置以及IDE中的项目创建(图文教程)

    Maven在Windows中的配置以及IDE中的项目创建(图文教程)

    这篇文章主要介绍了Maven在Windows中的配置以及IDE中的项目创建(图文教程),具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Spring BeanUtils忽略空值拷贝的方法示例代码

    Spring BeanUtils忽略空值拷贝的方法示例代码

    本文用示例介绍Spring(SpringBoot)如何使用BeanUtils拷贝对象属性忽略空置,忽略null值拷贝属性的用法,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-03-03
  • Java利用MultipartFile实现上传多份文件的代码

    Java利用MultipartFile实现上传多份文件的代码

    这篇文章主要介绍了Java利用MultipartFile实现上传多份文件的代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • Java实现全排列的三种算法详解

    Java实现全排列的三种算法详解

    从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。本文总结了Java实现全排列的三种算法,需要的可以参考下
    2022-06-06

最新评论