Jenkins控制器连接代理报错:密钥交换未完成,连接已关闭
解决Jenkins SSH代理连接失败:密钥交换未完成,连接已关闭
先把你遇到的错误信息贴出来方便定位:
[05/02/18 15:26:59] [SSH] 正在打开至
的SSH连接
密钥交换未完成,连接已关闭。
java.io.IOException: 连接至:22时出现问题
at com.trilead.ssh2.Connection.connect(Connection.java:818)
at hudson.plugins.sshslaves.SSHLauncher.openConnection(SSHLauncher.java:1324)
at hudson.plugins.sshslaves.SSHLauncher$2.call(SSHLaunche...
这类报错大概率是密钥交换算法不兼容、网络连通性问题或者SSH配置错误导致的,我给你梳理几个排查和解决步骤:
1. 检查SSH服务端的密钥交换算法支持
Jenkins的SSH插件依赖trilead SSH库,有些代理节点的SSH服务端可能配置了严格的算法列表,和Jenkins支持的不匹配:
- 登录代理节点,打开
/etc/ssh/sshd_config文件,查看是否有KexAlgorithms配置项。如果有,确保它包含Jenkins兼容的算法,比如diffie-hellman-group-exchange-sha256、ecdh-sha2-nistp256。 - 如果没有配置
KexAlgorithms,可以手动添加兼容算法(比如KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256),然后重启SSH服务:sudo systemctl restart sshd - 先在Jenkins控制器上用SSH客户端测试连接,看具体的密钥交换报错:
看输出里的密钥交换环节,有没有提示“no matching key exchange method found”这类明确的算法不兼容信息。ssh -v <你的代理节点用户名>@<代理IP>
2. 验证网络连通性和端口开放情况
网络层面的拦截也会导致连接中途断开:
- 在Jenkins控制器上ping代理节点IP,确认网络可达:
ping <代理IP> - 检查控制器和代理之间的防火墙、安全组,确保22端口是开放的。用telnet测试端口连通性:
如果能看到类似telnet <代理IP> 22SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5的banner信息,说明端口是通的。
3. 检查SSH密钥对的权限和配置
密钥权限不对是SSH连接失败的常见原因:
- 确保Jenkins控制器上使用的私钥权限是
600(只有所有者能读写),避免权限过高被SSH拒绝:chmod 600 /path/to/jenkins/private/key - 代理节点上的
~/.ssh/authorized_keys文件必须正确添加Jenkins的公钥,同时文件权限要设为600,父目录.ssh权限设为700:chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys - 如果你用的是密码登录,确认代理节点的
sshd_config里PasswordAuthentication设置为yes,并且密码正确。
4. 更新Jenkins SSH插件
旧版本的SSH插件可能存在兼容性bug:
- 登录Jenkins后台,进入插件管理,找到SSH Slaves插件,检查是否有更新,直接升级到最新稳定版本。更新插件会同步更新依赖的trilead SSH库,解决一些已知的密钥交换问题。
5. 升级代理节点的OpenSSH版本
如果代理节点用的是非常老旧的OpenSSH版本(比如低于6.0),可能不支持现代的密钥交换算法,建议升级到较新的稳定版本:
- Debian/Ubuntu系统:
sudo apt update && sudo apt install openssh-server - RHEL/CentOS系统:
sudo yum update openssh-server
内容的提问来源于stack exchange,提问作者Merowinger
相关产品推荐
相关产品推荐

