使用ssh2_connect连接服务器失败,密钥交换错误求助
问题分析与解决办法
从服务器日志和PHP报错来看,核心问题是SSH密钥算法不匹配:你的PHP ssh2扩展默认只提供ssh-rsa、ssh-dss这类旧版主机密钥算法,但远程服务器已禁用这些不安全的算法,导致双方无法协商出可用的加密方式,连接失败。
解决步骤
1. 修改ssh2_connect参数,指定兼容的密钥算法
在ssh2_connect的第三个参数中添加hostkey选项,指定服务器支持的现代密钥算法(比如rsa-sha2-256、rsa-sha2-512,是当前主流服务器普遍支持的类型)。同时修正代码中直接输出流资源的问题:
$connection = ssh2_connect('IP_ADDRESS', 22, [ 'hostkey' => 'rsa-sha2-256,rsa-sha2-512,ssh-rsa' ]); if (!$connection) { die('远程服务器连接失败'); } // 密码认证 if (!ssh2_auth_password($connection, 'user', 'pass')) { die('账号密码验证失败'); } // 执行命令并读取结果 $stream = ssh2_exec($connection, 'ls'); stream_set_blocking($stream, true); // 设置阻塞模式确保读取完整内容 $output = stream_get_contents($stream); echo $output; // 关闭流资源 fclose($stream);
2. 确认服务器支持的密钥算法
如果上述代码仍报错,可通过本地终端的ssh命令查看服务器支持的算法:
ssh -v user@IP_ADDRESS
在输出中找到debug1: host key algorithms:字段,将对应的算法添加到代码的hostkey参数中即可。
3. 升级ssh2扩展(可选)
若你的PHP ssh2扩展版本过旧,可能本身不支持新密钥算法,可尝试通过PECL重新安装最新版:
pecl install ssh2
内容的提问来源于stack exchange,提问作者Yamile
相关产品推荐
相关产品推荐

