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
相关产品推荐
相关产品推荐

