ssh client 报 algorithm negotiation failed的解决方法

本文介绍了解决SSH连接问题的方法,通过修改sshd_config文件中的密钥交换算法、密码算法及MAC算法,使SSH服务能够正常运行。文章详细列出了解决方案的具体步骤,包括配置文件的修改内容和重启SSH服务的命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SSH之前一直连不上,说密钥交换算法不匹配,一开始懒得弄,发现putty可以正常用。今天有空来搞搞。

方法:

修改sshd的配置文件 /etc/ssh/sshd_config

在配置文件中添加:

Ciphers aes128-cbc,aes192-cbc,aes256-cbc,aes128-ctr,aes192-ctr,aes256-ctr,3des-cbc,arcfour128,arcfour256,arcfour,blowfish-cbc,cast128-cbc

MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-sha1-96,hmac-md5-96

KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1,curve25519-sha256@libssh.org

修改之后保存,sudo /etc/init.d/ssh restart重启ssh服务。应该就ok。

重启的时候如果遇到:Job for ssh.service failed because the control process exited with error codesee systemctl status ssh.service and journalctl -xe for details. 应该是配置文件修改的时候改出了问题。输入sudo /usr/sbin/sshd -T进行检测,如果是配置文件的问题会直接提醒具体的行和内容,修改好之后再尝试重启就ok了 。

<think>嗯,用户在使用JSch 0.1.54连接OpenSSH 9.3时遇到了“algorithm negotiation failed”错误。我需要先理解这个问题的根本原因。 首先,OpenSSH不断更新其支持的加密算法,通常会淘汰旧的不安全算法。而JSch作为一个Java的SSH库,可能没有及时跟上这些变化。特别是OpenSSH 9.3可能移除了某些老旧的算法,而JSch 0.1.54默认还在使用这些算法,导致协商失败。 接下来,我需要考虑解决方法。常见的解决办法包括升级JSch到最新版本,因为新版本可能已经添加了对新算法的支持。但如果用户因为某些原因不能升级,可能需要手动配置JSch使用支持的算法。 另外,检查服务器支持的算法列表也很重要。用户可以通过运行`ssh -Q key`等命令获取信息,然后确保JSch配置与之匹配。比如,设置加密算法为aes256-ctr,或者调整密钥交换算法和MAC算法。 还要注意JSch的日志级别,开启DEBUG模式可以帮助用户看到具体的协商过程,找出哪些算法不匹配。同时,确保服务器没有禁用某些算法,可能需要修改sshd_config文件,重新启动SSH服务。 最后,如果所有方法都无效,可能需要考虑其他库,如Apache MINA SSHD或sshj,或者直接联系维护者寻求帮助。需要提醒用户测试时使用临时配置,避免影响现有连接。</think>当使用较旧版本的JSch(如0.1.54)连接较新版本的OpenSSH服务器(如9.3)时,出现`algorithm negotiation failed`错误通常是由于加密算法不兼容导致的。以下是逐步分析和解决方案: --- ### **原因分析** 1. **算法淘汰机制** OpenSSH 9.3默认禁用了一些老旧或不安全的算法(如`ssh-rsa` SHA-1签名、`diffie-hellman-group1-sha1`等),而JSch 0.1.54可能仍尝试使用这些算法进行协商。 2. **JSch的局限性** 旧版JSch未及时更新支持的算法列表,导致无法匹配服务器端的新算法(如`curve25519-sha256`, `rsa-sha2-256`等)。 --- ### **解决方案** #### 方法1:升级JSch库 - **推荐操作** 升级到最新版JSch(当前最新为0.2.15+),新版本已支持更多现代算法: ```xml <!-- Maven 依赖示例 --> <dependency> <groupId>com.github.mwiede</groupId> <artifactId>jsch</artifactId> <version>0.2.15</version> </dependency> ``` #### 方法2:手动配置JSch算法(不升级) 如果无法升级,需强制指定兼容算法: ```java import com.jcraft.jsch.*; public class SSHExample { public static void main(String[] args) { JSch jsch = new JSch(); Session session = jsch.getSession("user", "host", 22); // 配置算法白名单 java.util.Properties config = new java.util.Properties(); config.put("kex", "ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521"); config.put("server_host_key", "rsa-sha2-256,rsa-sha2-512"); config.put("cipher.s2c", "aes256-ctr,aes192-ctr,aes128-ctr"); config.put("cipher.c2s", "aes256-ctr,aes192-ctr,aes128-ctr"); config.put("mac.s2c", "hmac-sha2-256"); config.put("mac.c2s", "hmac-sha2-256"); session.setConfig(config); session.connect(); } } ``` #### 方法3:调整OpenSSH服务器配置 临时允许旧算法(需服务器权限): 1. 编辑`/etc/ssh/sshd_config`: ```bash # 允许RSA-SHA1(仅测试用) HostKeyAlgorithms +ssh-rsa PubkeyAcceptedAlgorithms +ssh-rsa KexAlgorithms +diffie-hellman-group-exchange-sha256 ``` 2. 重启SSH服务: ```bash sudo systemctl restart sshd ``` --- ### **诊断工具** 1. **查看服务器支持的算法** 在终端运行: ```bash ssh -Q key # 查看密钥类型 ssh -Q kex # 查看密钥交换算法 ssh -Q cipher # 查看加密算法 ssh -Q mac # 查看MAC算法 ``` 2. **启用JSch调试日志** ```java JSch.setLogger(new Logger() { public void log(int level, String message) { System.out.println("[JSch] " + message); } public boolean isEnabled(int level) { return true; } }); ``` --- ### **替代方案** 如果问题持续,可尝试其他Java SSH库: - **Apache MINA SSHD** ```xml <dependency> <groupId>org.apache.sshd</groupId> <artifactId>sshd-core</artifactId> <version>2.9.2</version> </dependency> ``` - **sshj** ```xml <dependency> <groupId>com.hierynomus</groupId> <artifactId>sshj</artifactId> <version>0.34.0</version> </dependency> ``` --- ### **总结** - **根本矛盾**:OpenSSH的安全更新与客户端库滞后性之间的矛盾。 - **优先升级JSch**,若受限则手动配置算法白名单。 - 生产环境中,建议服务器保持默认安全配置,优先更新客户端库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值