You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CentOS7下PHP7.4调用ssh2_connect报密钥交换错误如何解决?

PHP ssh2_connect 密钥交换失败问题解决方法

问题描述

使用以下代码连接目标服务器:

ssh2_connect("<<server-ip>>", 22)

收到错误提示:

ssh2_connect(): error starting up ssh connection(-5): unable to exchange encryption keys

环境信息:

  • PHP版本:7.4.29
  • 操作系统:CentOS Linux 7
  • 已安装ssh2扩展和libssh2 1.8.0

解决步骤

1. 排查加密算法兼容性

  • 在CentOS服务器上执行ssh -vvv <<server-ip>>手动连接目标服务器,查看输出中的加密算法协商过程,确认目标服务器支持的加密算法、密钥交换算法列表。
  • 在ssh2_connect调用中指定兼容的算法,示例代码:
ssh2_connect("<<server-ip>>", 22, array(
    'hostkey' => 'ssh-rsa', // 替换为目标服务器支持的主机密钥类型
    'crypt' => array('aes256-ctr', 'aes128-ctr'), // 替换为目标服务器支持的加密算法
    'kex' => array('diffie-hellman-group14-sha1') // 替换为目标服务器支持的密钥交换算法
));

2. 更新libssh2及ssh2扩展

libssh2 1.8.0可能缺少对部分新加密算法的支持,建议更新到最新稳定版:

  • 检查当前libssh2版本:pkg-config --modversion libssh2
  • 卸载旧版本:
yum remove libssh2-devel libssh2 -y
  • 下载并编译安装最新libssh2(以1.11.0为例):
wget https://www.libssh2.org/download/libssh2-1.11.0.tar.gz
tar zxf libssh2-1.11.0.tar.gz
cd libssh2-1.11.0
./configure --prefix=/usr
make && make install
  • 重新编译安装适配PHP7.4的ssh2扩展:
pecl uninstall ssh2
pecl install ssh2-1.3.1
  • 重启PHP-FPM或Apache服务,确保扩展生效:
systemctl restart php-fpm # 若使用Apache则替换为systemctl restart httpd

3. 检查目标服务器SSH配置

登录目标服务器,修改/etc/ssh/sshd_config,确保配置的算法包含libssh2支持的类型:

# 添加或修改以下配置项
Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1
MACs hmac-sha2-256,hmac-sha2-512,hmac-sha1

修改后重启sshd服务:

systemctl restart sshd

4. 检查SELinux限制

CentOS 7的SELinux可能阻止PHP发起SSH连接:

  • 临时关闭SELinux测试:setenforce 0,如果连接恢复正常,再永久修改配置:
    编辑/etc/selinux/config,将SELINUX=enforcing改为SELINUX=permissive,重启系统生效。

内容的提问来源于stack exchange,提问作者Mahesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:33:37